Field 类是反射机制中重要的组成部分,提供了获取对象的成员变量的类型和 get 、set 方法。
官方定义
Field 类提供动态访问(注:即运行时访问)类或接口单个字段信息的能力,被反射字段可以是类字段或者实例字段。在 get、set 期间允许使用宽转换(注:即将字段实际类型向上转换),如果向下转换会抛出 IllegalArgumentException
异常(注:这意味着编译器不能自动拆装箱)
成员变量类型
在 java
中,所有的变量只有两种类型:基本类型和引用类型
- 基本数据类型(8种)
- 整数:byte, short, int, long
- 浮点数:float, double
- 字符:char
- 布尔值:boolean
- 引用类型(也叫类类型、复合类类型)
- 所有的引用类型都继承自
java.lang.Object
- 类,枚举,数组,接口都是引用类型
java.io.Serializable
接口,基本类型的包装类(比如java.lang.Double
)也是引用类型
- 所有的引用类型都继承自
方法区
返回值 | 方法名 | 解释 |
---|---|---|
Class<?> | getType() |
获取属性声明时 class 对象 |
Type | getGenericType() |
返回属性声明的 Type 类型,通过 Type 接口能够获取 List<String> 中的泛型类型 String,getType() 只能获取运行时 class 类型即List.class |
String | getName() |
获取属性声明时名字 |
Annotation[] | getAnnotations() |
获得这个属性上所有的注解 |
int | getModifiers() |
以整数形式返回获取属性的修饰符,Modifier 类用于解码该整数 |
boolean | isEnumConstant() |
判断这个属性是否是枚举类 |
boolean | isSynthetic() |
判断这个属性是否是复合类(除基本数据类型外,其他类均为复合类) |
Object | get(Object obj) |
取得 obj 对象这个 Field 上的值 |
void | set(Object obj, Object value) |
向 obj 对象的这个 Field 设置新值 value |
异常
在使用 Field 时,会有三种情况出现异常
-
IllegalArgumentException
:自动拆装箱失败、数据转换异常;Field 类型为 包装类型 Integer ,使用
getInt()
取值,无法完成自动拆箱,在jdk1.8
上field.set(obj,1)
正常;高精度向低精度转换,Field 类型为byte,结果field.set(obj,1)
,此处的 1 为int -
NoSuchFieldException
:反射非 public 访问权限导致 -
illegalaccessexception
: 修改 final 修饰的字段值
其中异常2、3可以通过 field.setAccessible(true);
解决