------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1,什么是反射机制?
所谓反射,就是在java中获得字节码就能够动态的对类的属性和方法进行加载调用的这个过程。
详细的讲就是在运行状态中,只要获得类的字节码,对于任意一个类,都能够知道这个类的所有属性和方法,对任意一个对 象,都能调用它的任意一个方法;
这种动态获取信息以及动态调用对象的方法功能就叫做JAVA的反射机制
2,一个类可以通过3种方式对类进行加载
(1).Classcls = class.forName("类名")//如"java.lang.String",类名要连着包名一起。最好的方式
(2).Class的getClass();方法
(3).Classcls = String.class;
3,初始化时存在下面2种情况
(1).编译时无法知道对应的构造方法
(2).运行时才知道
从而引出了反射机制,简单的说反射就是把Java类中的各种成分映射成相应的Java类。
只要知道一个Java类中的任何成分,就可以映射出这个类。
4,Constructor类:用于获得类的构造方法
Constructorconstructor = String.class.getConstructor(String.class);
Stringstr2 = (String)construtctor.newInstance(new String("abc"));
由于编译器不知道constructor是什么类型的构造方法,所以下面一行要给constructor的类型做一个声明!
5,Field类:代表类中的一个成员变量
1.先获取类的字节码
2.通过getFiled()来获得类中某一个成员变量,
3.get()方法获得对象上变量的值。
例如:如果类中X变量为private的,我们知道其他类将访问不到变量X
那么通过反射机制我们可以暴力反射来访问它
我们定义一个ReflectPoint类,里面有一个private int x属性
ReflectPointpt = new ReflectPoint();//只要类ReflectPoint中有声明的变量都可以反射到
Fieldfield = pt.getClass().getDeclaredField("x");//得到声明的属性X
field.setAccessible(true);//设置连通
然后可以通过field.get(pt)方法就可以读取到ReflectPoint类中的私有属性X,这就叫做暴力反射。
扫描对象中成员属性中String类型中含有“b”的字符串并“a”替换
private static void changeStringValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for (Field field : fields) {
// if(field.getType() == String.class) //字节码的比较都用"=="而不用equals
if (field.getType() == String.class) {
String oldValue = (String) field.get(obj);
String newValue = oldValue.replace('b', 'a');
field.set(obj, newValue);// 此步操作才算是把对类的操作落实到对象上面
}
}
}