java反射机制
0)获取Class对象的三种方法
package com.bean;
/**
* @author: 肖德子裕
* @date: 2018/8/29 08:35
* @description: 用户实体类
*/
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.test;
/**
* @author: 肖德子裕
* @date: 2018/8/29 08:34
* @description: 测试java.lang.Class对象的获取方式
* java不是动态语言,但是可以通过反射做动态操作
* 动态语言:程序运行时可以改变程序结构或变量类型(如:Python;JS)
* 一个类被加载后,JVM会创建该类的一个Class对象,类的整个结构会放到该对象中
* 这个对象就像镜子一样,可以看见该类的所有信息(所以叫反射机制)
* 一个类只对应一个Class对象
* 反射在提高开发效率的同时会增加程序运行的时间,可以禁止安全检查,以提高运行速度(设置setAccessible(true))
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.bean.User");
System.out.println(clazz);
Class strClass = String.class;
Class strClass2 = args.getClass();
System.out.println(strClass == strClass2);
}
}
1)获取类的信息
package com.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author: 肖德子裕
* @date: 2018/8/29 13:56
* @description: 利用反射的API,获取类的信息
*/
public class Demo2 {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.bean.User");
//获取包名+类名
System.out.println(clazz.getName());
//获取类名
System.out.println(clazz.getSimpleName());
System.out.println("==========================");
//获取非私有的属性
Field[] fields = clazz.getFields();
System.out.println(fields.length);
//获取所有属性,包括私有
Field[] fields1 = clazz.getDeclaredFields();
for (Field field : fields1) {
System.out.println("属性:" + field);
}
//获取指定属性
Field field = clazz.getDeclaredField("name");
System.out.println("name:" + field);
System.out.println("==========================");
//获取所有方法
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println("方法:" + method);
}
//获取指定方法(无参)
Method method = clazz.getDeclaredMethod("getName", null);
//获取指定方法(有参)
Method method1 = clazz.getDeclaredMethod("setName", String.class);
System.out.println("==========================");
//获取所有构造器(构造方法)
Constructor[] constructors = clazz.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println("构造器:" + constructor);
}
//获取指定构造器
Constructor constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
System.out.println("指定构造器:" + constructor);
}
}
2)执行方法
package com.test;
import com.bean.User;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author: 肖德子裕
* @date: 2018/8/29 14:21
* @description: 利用反射的API,获取实例,进行操作
*/
public class Demo3 {
public static void main(String[] args) throws Exception {
Class<User> clazz = (Class<User>) Class.forName("com.bean.User");
//调用无参初始化对象
User user = clazz.newInstance();
//调用有参初始化对象
Constructor<User> constructor = clazz.getDeclaredConstructor(int.class, String.class, int.class);
User user1 = constructor.newInstance(001, "xdzy", 18);
System.out.println(user1.getName());
System.out.println("=====================");
//执行方法
User user3 = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setName", String.class);
method.invoke(user3, "xdzy");
System.out.println(user3.getName());
System.out.println("=====================");
//操作属性
User user4 = clazz.newInstance();
Field field = clazz.getDeclaredField("name");
//禁止安全检查(直接可以访问所有属性)
field.setAccessible(true);
field.set(user4, "xdzy");
System.out.println(user4.getName());
System.out.println(field.get(user4));
}
}