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);`
原文链接: 测试局部朗读