JAVA 反射之java.lang.reflect.Field

JAVA 反射之java.lang.reflect.Field

Scroll Down

Field是什么

Field是一个类,位于java.lang.reflect包下。在Java反射中Field类描述的是类的属性信息,功能包括:

  • 获取当前对象的成员变量的类型
  • 对成员变量重新设值

Field方法

方法描述
boolean equals(Object obj)将此字段与指定对象进行比较。
Object get(Object obj)返回指定对象上由Field表示的字段的值。
T getAnnotation(Class annotationClass)如果存在这样的注释,则返回该元素的指定类型的注释,否则返回null。
boolean getBoolean(Object obj)获取静态或实例布尔字段的值。
byte getByte(Object obj)获取静态或实例字节字段的值。
char getChar(Object obj)获取char类型的静态或实例字段的值,或者通过加宽转换可转换为char类型的另一个基本类型的值。
Annotation[] getDeclaredAnnotations()返回此元素上直接存在的所有注释。
Class<?> getDeclaringClass()返回表示声明由Field对象表示的字段的类或接口的Class对象。
double getDouble(Object obj)获取double类型的静态或实例字段的值,或者通过加宽转换可转换为double类型的另一个基本类型的值。
float getFloat(Object obj)获取类型为float的静态或实例字段的值,或者通过加宽转换可转换为float类型的另一个原始类型的值。
Type getGenericType()返回一个Type对象,该对象表示由Field对象表示的字段的声明类型。
int getInt(Object obj)获取类型为int的静态或实例字段的值,或者通过加宽转换可转换为类型int的另一个原始类型的值。
long getLong(Object obj)获取long类型的静态或实例字段的值,或者通过扩展转换可转换为long类型的另一个原始类型的值。
int getModifiers()返回由Field对象表示的字段的Java语言修饰符,以整数形式返回。
String getName()返回Field对象表示的字段的名称。
short getShort(Object obj)获取类型为short的另一个原始类型的静态或实例字段的值,通过加宽转换可转换为short类型。
Class<?> getType()返回一个Class对象,用于标识Field对象所表示的字段的声明类型。
int hashCode()返回Field的哈希码。
boolean isEnumConstant()如果字段表示枚举类型的元素,则返回true; 否则返回false。
boolean isSynthetic()将指定对象参数上的Field对象表示的字段设置为指定的新值。
void setBoolean(Object obj, boolean z)为指定对象上字段的值设置为布尔值。
void setByte(Object obj, byte b)为指定对象上字段的值设置为字节值。
void setChar(Object obj, char c)为指定对象上字段的值设置为字符值。
void setDouble(Object obj, double d)为指定对象上字段的值设置为double值。
void setFloat(Object obj, float f)为指定对象上字段的值设置为浮点数。
void setInt(Object obj, int i)为指定对象上字段的值设置为int值。
void setLong(Object obj, long l)为指定对象上字段的值设置为long值。
void setShort(Object obj, short s)为指定对象上字段的值设置为short值。
String toGenericString()返回描述此Field对象的字符串,包括其通用类型。
String toString()返回描述此Field对象的字符串。

如何使用Field

如何获取Field类对象

一共有4种方法:

  • Class.getFields(): 获取类中public类型的属性,返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段
  • getDeclaredFields(): 获取类中所有的属性(public、protected、default、private),但不包括继承的属性,返回 Field 对象的一个数组
  • getField(String name): 获取类特定的方法,name参数指定了属性的名称
  • getDeclaredField(String name): 获取类特定的方法,name参数指定了属性的名称

Field 类对象常用方法

  • 获取变量的类型:
    • Field.getType():返回这个变量的类型
    • Field.getGenericType():如果当前属性有签名属性类型就返回,否则就返回 Field.getType()
    • isEnumConstant() : 判断这个属性是否是枚举类
  • 获取成员变量的修饰符
    • Field.getModifiers() 以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符
  • 获取和修改成员变量的值
    • getName(): 获取属性的名字
    • get(Object obj): 返回指定对象obj上此 Field 表示的字段的值
    • set(Object obj, Object value): 将指定对象变量上此 Field 对象表示的字段设置为指定的新值

常见错误

  • set(Object obj, Object value)时,新value和原value的类型不一致导致,如下:无法转换类型导致的 java.lang.IllegalArgumentException(注意:反射获取或者修改一个变量的值时,编译器不会进行自动装/拆箱,所以int 和Integer需手动修改)
  • set(Object obj, Object value)时,修改 final类型的变量导致的 IllegalAccessException。由于 Field 继承自 AccessibleObject , 我们可以使用 AccessibleObject.setAccessible() 方法告诉安全机制,这个变量可以访问即可解决,如field.setAccessible(true)。
  • getField(String name)getFields()获取非 public 的变量,编译器会报 java.lang.NoSuchFieldException 错。

系列

  1. Class
  2. Field
  3. Method

Thanks

  1. 作者:EllieWong
    链接:https://blog.csdn.net/a327369238
    来源:csdn

  2. 作者: 易百教程
    链接: https://www.yiibai.com/javareflect/java_reflect_field.html
    来源: 易百教程