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 错。
系列
Thanks
-
作者:EllieWong
链接:https://blog.csdn.net/a327369238
来源:csdn -
作者: 易百教程
链接: https://www.yiibai.com/javareflect/java_reflect_field.html
来源: 易百教程