java.lang.reflect.Field

本文为 Java 源码阅读中的一节,重要程度为 2

NONGFAH 写于 2019-11-07

Field 类是反射机制中重要的组成部分,提供了获取对象的成员变量的类型和 get 、set 方法。

官方定义

Field 类提供动态访问(注:即运行时访问)类或接口单个字段信息的能力,被反射字段可以是类字段或者实例字段。在 get、set 期间允许使用宽转换(注:即将字段实际类型向上转换),如果向下转换会抛出 IllegalArgumentException 异常(注:这意味着编译器不能自动拆装箱)

成员变量类型

java 中,所有的变量只有两种类型:基本类型和引用类型

  • 基本数据类型(8种)
    1. 整数:byte, short, int, long
    2. 浮点数:float, double
    3. 字符:char
    4. 布尔值:boolean
  • 引用类型(也叫类类型、复合类类型)
    1. 所有的引用类型都继承自 java.lang.Object
    2. 类,枚举,数组,接口都是引用类型
    3. 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 时,会有三种情况出现异常

  1. IllegalArgumentException:自动拆装箱失败、数据转换异常;

    Field 类型为 包装类型 Integer ,使用 getInt() 取值,无法完成自动拆箱,在 jdk1.8field.set(obj,1)正常;高精度向低精度转换,Field 类型为byte,结果 field.set(obj,1) ,此处的 1 为int

  2. NoSuchFieldException:反射非 public 访问权限导致

  3. illegalaccessexception : 修改 final 修饰的字段值

其中异常2、3可以通过 field.setAccessible(true); 解决