18.4 使用反射生成并操作对象 18.4.3 访问成员变量值
通过Class
对象的getFields()
或getField()
方法可以获取该类所包括的全部成员变量或指定成员变量(Field
对象).
Field类
Field
提供了如下两组方法来读取或设置指定成员变量的值。
访问基本类型的成员变量
getXxx(Object object)
:获取object
对象的该成员变量的值。此处的Xxx
对应8种基本类型,setXxx(Object object,Xxx value)
:将object
对象的该成员变量设置成value
值。此处的Xxx
对应8种基本类型,
访问引用类型的成员变量
对应引用类型,直接使用get
和set
方法即可
get(Object object)
:获取object
对象的该成员变量的值。set(Object object,Xxx value)
:将object
对象的该成员变量设置成value
值。
使用这两个方法可以随意地访问指定对象的所有成员变量,包括private
修饰的成员变量。
程序示例
1 | import java.lang.reflect.*; |
运行结果:
1 | p对象的age成员变量的值:30 |
代码详解
上面程序中先定义了一个Person
类,该类里包含两个private
成员变量:name
和age
,在通常情况下,这两个成员变量只能在Person
类里访问。但本程序FieldTest
的main()
方法中通过反射修改了Person
对象的name
、age
两个成员变量的值。
- 代码:
personClazz.getDeclaredField("name");
中的getDeclaredField
方法获取了名为name
的成员变量,注意此处不是使用getField
方法,因为getField
方法只能获取public
访问控制的成员变量,而getDeclaredField
方法则可以获取所有的成员变量: - 代码:
nameField.setAccessible(true);
设置通过反射访问成员变量name
时不受访问权限的控制; - 代码
nameField.set(p , "Yeeku.H.Lee");
修改了Person
对象的name
成员变量的值。
修改Person
对象的age
成员变量的值的方式与此完全相同。
编译、运行上面程序,会看到如下输出:
1 | Person[name:Yeeku.H.Lee , age:30 ] |
总结
Class
对象的getField
方法只能获取public
访问控制的成员变量,而getDeclaredField
方法则可以获取所有的成员变量在获取
(get
)或者设置
(set
)某个私有的成员变量之前,必须先调用该成员变量(Field)
的setAccessible
方法,并把参数设置为true
.
例如要获取成员变量name
的值之前,要先调用:nameField.setAccessible(true)
;`
原文链接: 测试局部朗读