反射,剖析 Java类 中的 各个组成部分,映射成 一个个 Java对象,多用于 框架和组件,写出复用性高的通用程序。
测试类代码如下:
class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person() {}
public Person(String name) {
this.name = name;
}
}
构造方法Constructor
import org.junit.Test;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
@Test
public void demo1() throws Exception {
String className = "Person";
Class clazz = Class.forName(className); //获得字节码对象
Constructor[] constructors = clazz.getConstructors();
System.out.println(constructors.length);
Object o1 = clazz.getConstructor().newInstance();
Person p1 = new Person();
System.out.println(o1.getClass() == p1.getClass());
Object o2 = clazz.getConstructor(String.class).newInstance("sketch");
Person p2 = new Person("sketch");
System.out.println(o2.getClass() == p2.getClass());
System.out.println(o1.getClass() == o2.getClass());
}
}
输出如下:
2
true
true
true
不难看出,获得的 是 同一个 字节码对象。
成员变量Field
@Test
public void demo2() throws Exception{
Person p = new Person("sketch");
String className = "Person";
Class clazz = Class.forName(className); //获得字节码对象
Field[] fields = clazz.getDeclaredFields();
System.out.println(fields.length);
Field name = clazz.getDeclaredField("name");
name.setAccessible(true);
Object value = name.get(p); //p.getName()
System.out.println(value);
name.set(p, "Tara"); //p.setName("Tara")
System.out.println(name.get(p));
}
输出如下:
1
sketch
Tara
方法Method
@Test
public void demo3() throws Exception {
Person p = new Person();
String className = "Person";
Class clazz = Class.forName(className); //获得字节码对象
Method setName = clazz.getDeclaredMethod("setName", String.class);
//如果执行静态方法,第一个参数obj传入null
setName.invoke(p, "sketch"); //p.setName("sketch")
Method getName = clazz.getDeclaredMethod("getName", null);
//如果执行静态方法,第一个参数obj传入null
Object name = getName.invoke(p, null); //p.getName()
System.out.println(name);
}
输出如下:
sketch