一、Field类
Field类提供了某个类或接口中的属性信息,既可以是类属性,也可以是实例属性。
1. 字段介绍
//这个属性是属于哪个类,通过调用getDeclaringClass方法可以获取到声明这个属性的类
private Class<?> clazz;
private int slot;
//主要用于虚拟机实施反射
private String name;
//该属性是什么类型的
private Class<?> type;
//该属性的修饰符,位表示
private int modifiers;
// 属性的签名
private transient String signature;
// generic info repository; lazily initialized
private transient FieldRepository genericInfo;
//属性的所有注解组成的数组
private byte[] annotations;
// Cached field accessor created without override
private FieldAccessor fieldAccessor;
// Cached field accessor created with override
private FieldAccessor overrideFieldAccessor;
// For sharing of FieldAccessors. This branching structure is
// currently only two levels deep (i.e., one root Field and
// potentially many Field objects pointing to it.)
//
// If this branching structure would ever contain cycles, deadlocks can
// occur in annotation code.
private Field root;
2. get(Object obj)
该方法的参数中传入一个对象,然后返回的是该对象对应的属性值。如果返回值是一个原始数据类型,会进行自动装箱。
如果该属性是静态属性,则直接忽视传入的对象参数,因为这个属性属于类,该参数可以为null。
如果该属性是实例属性,当传入的对象为空或者不包含该属性时,会抛出相应的异常,比如NullPointerException或IllegalArgumentException。
如果想要获取到属性值,还需要考虑该属性的权限问题,如果是inaccessible,则会抛出IllegalAccessException异常。通过调用Field.setAccessible(boolean),可以设置该属性的获取权限,该方法被声明于Field类的父类AccessibleObject。
@CallerSensitive
public Object get(Object obj)
throws IllegalArgumentException, IllegalAccessException