您的位置:首页 > 编程语言 > Java开发

Java 反射机制学习Demo

2016-08-27 13:52 701 查看

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()

用于获取类中定义的全部变量(包括私有变量)
编译并运行,程序结果如下图:



从结果中可以看出,尽管在ReflectTest类中,flag 和value都被定义为私有变量,setFlag()也被定义为私有方法,但是通过反射机制,可以调用私有方法setFlag()修改flag的值,也可以直接修改私有变量value的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: