1. 基本概念
java.lang.reflect.Field类:主要用于描述获取到的单个成员变量信息
2. Class类中,和Field有关的常用方法
方法声明 | 功能介绍 |
Field getDeclaredField(String name) | 用于获取此Class对象所表示类中参数指定的单个成员变量信息 |
Field[] getDeclaredField() | 用于获取此Class对象所表示类中所有成员变量信息 |
3. Field类的常用方法
Object get(Object obj) | 获取参数对象obj中,此Field对象所表示成员变量的数值 |
void set(Object obj, Object value) | 将参数对象obj中,此Field对象表示成员变量的数值,修改为参数value的数值 |
void setAccessible(boolean flag) | 当实参传递true时,则反射对象在使用时,应该取消java语言访问调查 |
int getModifiers() | 获取成员变量的访问修饰符 |
Class<?> getType() | 获取成员变量的数据类型 |
String getName() | 获取成员变量的名称 |
4. 代码示例
class PersonFieldTest {
main() throws Exception {
// 1. 使用原始方式,构造对象以及成员变量的数值,并打印
Person p1 = new Person("zhangfei",30);
// println("获取到的成员变量数值为:" + p1.name); // zhangfei
// 2. 使用反射机制来构造对象,以及获取成员变量的数值,并打印
// 2.1 获取Class对象
Class c1 = Class.forName("com.lagou.task20.Person");
// 2.2 根据Class对象,获取对应的有参构造方法
Constructor constructor = c1.getConstructor(String.class, int.class);
// 2.3 使用有参构造方法,得到Person类型的对象
Object object = constructor.newInstance("zhangfei",30);
// 2.4 根据Class对象,获取对应的成员变量信息
Field field = c1.getDeclaredField("name");
// 设置Java语言访问检查的取消 暴力反射
field.setAccessible(true);
// 2.5 使用Person类型的对象,来获取成员变量的数值,并打印
// 获取对象object中,名字为field成员变量的数值,也就是成员变量name的数值
print("获取到的成员变量数值为:" + field.get(object) ); // zhangfei
// 3. 使用原始方式,修改指定对象中,成员变量的数值后,再次打印
// p1.name = "guanyu";
// print("修改后成员变量的数值为:" + p1.name); // guanyu
// 4. 使用反射机制,修改指定对象中成员变量的数值后,再次打印
// 表示修改对象object中,名字为field成员变量的数值为guanyu,也就是成员变量name的数值为guanyu
field.set(object,"guanyu");
println("修改后成员变量的数值为:" + field.get(object) ); // guanyu
// 5. 获取Class对象对应类中,所有的成员变量
Field[] declaredFields = c1.getDeclaredFields();
for (Field ft : declearedFields) {
print("获取到的访问修饰符为:" + ft.getModifiers() );
print("获取到的数据类型为:" + ft.getType() );
print("获取到的成员变量名称是:" + ft.getName() );
}
}
}
原文:https://www.cnblogs.com/JasperZhao/p/14888721.html