1.1什么是反射机制
反射机制是指在程序运行过程中,对任意一个类可以获得其所有的属性和方法,并且任意对象都能调用其任意方法。通过Java的反射机制可以动态获取类和对象的信息,以及动态调用对象的方法。
1.2反射的应用
当程序在编译期间无法预知该对象和类的真实信息,只能通过运行时信息来发现该对象和类的真实信息,这种情况下通常通过反射机制来获取。例如以下代码,persion对象的编译时类型为Person,运行时类型为Student,我们无法在编译时获取Student类中的定义方法。
Person person = new Student();
如果我们想获得Student类中定义的方法,我们可以采用Java的反射机制来获取。
1.3 Java的反射API
- Class类:用于获取类的属性、方法等。
- Field类:表示类的成员变量,用于get和set类中的属性值
- Method类:用于获取方法的描述信息或执行某个方法
- Constructor类:类的构造方法
1.4 反射的过程
- 获取类的Class对象
- 调用Class对象对应的类中定义的方法
- 使用反射API获取并调用类的属性和方法
Person person = new Person();
Class clazz = Class.forName("reflection.Person");
// Class clazz = Person.class;
// Class clazz = person.getClass();
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("--------------------------------------------------------------------");
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("--------------------------------------------------------------------");
Constructor[] constructors = clazz.getDeclaredConstructors();
Object o = null;
for (Constructor constructor : constructors) {
System.out.println(constructor);
o = constructor.newInstance();
}
System.out.println("--------------------------------------------------------------");
Method setName = clazz.getMethod("setName", String.class);
setName.invoke(o,"Java");
Method getName = clazz.getMethod("getName");
Object invoke = getName.invoke(o);
System.out.println(invoke);
@Data
public class Person {
private String name;
private int age;
}
运行结果如下
public boolean reflection.Person.equals(java.lang.Object)
public java.lang.String reflection.Person.toString()
public int reflection.Person.hashCode()
public java.lang.String reflection.Person.getName()
public void reflection.Person.setName(java.lang.String)
public int reflection.Person.getAge()
public void reflection.Person.setAge(int)
protected boolean reflection.Person.canEqual(java.lang.Object)
--------------------------------------------------------------------
private java.lang.String reflection.Person.name
private int reflection.Person.age
--------------------------------------------------------------------
public reflection.Person()--------------------------------------------------------------
Java