java.lang.reflect.Field
1、Field类:主要是用来辅助 获取和操作 类的属性。
为我们提供了获取当前对象的成员变量的 全部属性信息和重新设值 的方法。
利用类型类反射该类型中的所有属性和方法
2、Field类的实例:描述了 类型类 的全部属性信息。
(包括:属性名称字段、属性类型、属性修饰符、属性注解 等等)
备注:类型类 --是指代表一个 类型 的类。比如说对象是你我他,那你我他 类型的类就是“人”。
3、应用获取类的属性信息
思路--先获得某个对象的 类型类对象,然后借此获取Field类的实例,最后调用Field类的方法获取属性
①获得类型类
Java中一切都是对象,一般所使用的对象都直接或间接继承自Object类。
Object类中包含一个方法名叫getClass(),利用这个方法就可以获得一个类型类的实例对象。
示例:Object obj = new Object();
所有的类型类都是Class类的实例-->Class clazz = obj.getClass();
另外一种写法,Object.class(注意是大写的O,obj.getClass()==Object.class)
在Java中表示一个特定类型的类型类可以用“类型.class”的方式获得。(即,Object.class)
注意--类型类是一一对应的,父类的类型类和子类的类型类是不同的。
②借此获取Field类的实例
clazz 是Class类的实例,直接调用Class中提供了4个相关的方法就OK。
(冒号后面的是方法返回的类型)
getField(String name):Field---用于返回一个指定名称的属性,但是这个属性必须是公有的,
这个属性可以在父类中定义。如果是私有属 性或者是保护属
性,那么都会抛出异常提示找不到这个属性。
getFields():Field[]---是返回类型中的所有公有属性,所有的私有属性和保护属性都找不到。
getDeclaredField(String name):Field---获得在这个类型的声明中定义的指定名称的属性,
这个属性必须是在这个类型的声明中定义,但可以
使私有和保护的。
getDeclaredFields():Field[]---获得在这个类型的声明中定义的所有属性,包括私有和保护的
属性都会被返回,但是所有父类的属性都不会被返回。
③调用Field类的方法获取属性
getType():Class---获得该属性的类型。
getName():String---获得属性名称。
isAccessible():boolean---判断该属性是否是可以访问,通常私有和保护的类型都是不可以访问。
setAccessible(boolean flag)---设置该属性是否可以访问
field.setAccessibe(true)属性可以访问--即获取访问权限(field是Field类的实例)
isArray():boolean---判断该类型是否是数组。
isEnum():boolean---判断该类型是否是枚举类型。
isInterface():boolean---判断该类型是否是接口。
isPrimitive():boolean---判断该类型是否是基本类型。
getSuperClass():Class---获得该类型的直接父类,若没有直接父类,那么返回null。
getInterfaces():Class[]---获得该类型实现的所有接口。
getComponentType():Class---如果该类型是一个数组,那么返回该数组的组件类型。
4、异常
IllegalAccessException - Field对象正在执行Java语言访问控制,并且底层字段无法访问。
IllegalArgumentException - 指定的对象不是声明底层字段(或其子类或实现者)的类或接口的实例。
NullPointerException - 指定的对象为null,该字段为实例字段。
ExceptionInInitializerError - 由此方法引发的初始化失败。
5、扩展:Java中所有的属性信息都用Field表示,所有的方法信息都用Method表示,
这两个类都是java.lang.reflect包中的类。
6、若对你有所帮助请点个赞。