Java 反射机制学习Demo
1. 什么是Java反射机制?
反射机制是Java语言的一个关键性质,它允许我们在程序运行时,获取类的全部(包括private修饰的)成员变量和成员方法,并能动态地改变这些成员变量和成员方法。
2.实例Demo
新建一个ReflectTest 类,代码如下:
ReflectTest.java:
public class ReflectTest {
private boolean flag; //布尔型 私有
private int value = 0; // 整型 私有
ReflectTest() { //构造函数
setFlag(false); //设置flag为false
}
private void setFlag(boolean flag) { //设置flag
this.flag = flag;
}
public void print() { //如果flag为true,则输出"flag is true",否则输出"flag is false"
if(flag) {
System.out.println("flag is true");
} else {
System.out.println("flag is false");
}
}
public void getValue() { //输出value的值
System.out.println(value);
}
}
新建一个test类,代码如下:
test.java:
import java.lang.reflect.Method;
import java.lang.reflect.Field;
public class test {
public static void main(String[] args) {
ReflectTest reflectTest = new ReflectTest();
reflectTest.print(); // flag is false
reflectTest.getValue(); //0
try {
// 反射拿到ReflectTest类中的setFlag(boolean flag)方法
Method method = reflectTest.getClass().getDeclaredMethod("setFlag", Boolean.TYPE);
method.setAccessible(true); //取消访问检查
method.invoke(reflectTest, true); // 传入true作为该方法的参数
reflectTest.print(); // flag is true
Field field = reflectTest.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(reflectTest, 1);
reflectTest.getValue(); // 1
} catch (Exception e) {
e.printStackTrace();
}
}
}
test.java 中有几个方法需要说明一下:
getClass() |
用于获取一个实例的类型类
比如:A a = new A();
则 a.getClass() 就是 A.class
|
getDeclaredMethod() |
用于获取类中定义的全部方法(包括私有方法)
|
getDeclaredField() | 用于获取类中定义的全部变量(包括私有变量) |