反射
使用反射在运行时分析对象
在上一小节,我们了解了一些反射当中的方法,知道如何去查询任意一个对象的属性、方法和构造器。
- 获取Class对象
- 对象中获取这个类的属性 getDeclaredFields()…
在这一小节,我们将了解查看类具体内容。
下面我们看一段实例:将会有一些注释 希望小伙伴可以认真观看
package com.reflection;
import java.lang.reflect.Field;
public class ClassTest7 {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
Student s = new Student("张三", 18, "湖南", 1);
Class<? extends Student> c = s.getClass();
//我们获取一个私有的name属性
Field f = c.getDeclaredField("name");
System.out.println(f);
/*
这段代码有一个问题。我们上面获取的是一个似有的属性,所以在get set中JVM会抛出一个
illegalAccessException 只能对可以访问的字段使用get和set方法
Java安全机制允许查看对象的属性 但是不允许读写那些字段的值(除非有权限)
解决方案: 暴力反射
*/
//暴力反射
//小伙伴需要查看这段问题 首先把这段代码所注释掉
f.setAccessible(true); //默认是false 现在我们就可以进行获取私有的属性值了
Object o = f.get(s);
System.out.println(o);
}
}
setAccessible方法是AccessibleObject类中的一个方法,它是Filed、Method、Constructor类的公共父类。拥有这个特性是为了调试、持久存储和类似机制提供的。
介绍方法的作用:
- void setAccessible(boolean flag)
- 设置或取消可访问对象的可访问标志,如果拒绝访问抛出illegalAccessExcpetion异常
- Field getFiled(String name)
- Field[] getFileds()
得到指定名的公共字段,或所有字段的一个数组 - Field getDeclaredField(String name)
- 得到类中声明指定的字段名
- Object get(Object obj)
- 返回obj对象中的属性值