JavaSE:反射机制

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.  代码示例

 1 class PersonFieldTest {
 2 
 3     main() throws Exception {
 4 
 5     
 6 
 7       //  1.  使用原始方式,构造对象以及成员变量的数值,并打印
 8 
 9       Person p1 = new Person("zhangfei",30);
10 
11       //  println("获取到的成员变量数值为:" + p1.name);  //  zhangfei 
12 
13  
14 
15       //  2.  使用反射机制来构造对象,以及获取成员变量的数值,并打印
16 
17       //  2.1   获取Class对象
18 
19       Class c1 = Class.forName("com.lagou.task20.Person");
20 
21       //  2.2  根据Class对象,获取对应的有参构造方法
22 
23       Constructor constructor = c1.getConstructor(String.class, int.class);
24 
25       //  2.3  使用有参构造方法,得到Person类型的对象
26 
27       Object object = constructor.newInstance("zhangfei",30);
28 
29       //  2.4  根据Class对象,获取对应的成员变量信息
30 
31       Field field = c1.getDeclaredField("name");
32 
33       //  设置Java语言访问检查的取消  暴力反射
34 
35       field.setAccessible(true);
36 
37       //  2.5  使用Person类型的对象,来获取成员变量的数值,并打印
38 
39       //  获取对象object中,名字为field成员变量的数值,也就是成员变量name的数值
40 
41       print("获取到的成员变量数值为:" + field.get(object) );  //  zhangfei
42 
43  
44 
45       //  3.  使用原始方式,修改指定对象中,成员变量的数值后,再次打印
46 
47       //  p1.name = "guanyu";
48 
49       //  print("修改后成员变量的数值为:" + p1.name);  //  guanyu
50 
51  
52 
53       //  4.  使用反射机制,修改指定对象中成员变量的数值后,再次打印
54 
55       //  表示修改对象object中,名字为field成员变量的数值为guanyu,也就是成员变量name的数值为guanyu
56 
57       field.set(object,"guanyu");
58 
59       println("修改后成员变量的数值为:" + field.get(object) );  //  guanyu
60 
61  
62 
63       //  5.  获取Class对象对应类中,所有的成员变量
64 
65       Field[] declaredFields = c1.getDeclaredFields();
66 
67       for (Field ft : declearedFields) {
68 
69         print("获取到的访问修饰符为:" + ft.getModifiers() );
70 
71         print("获取到的数据类型为:" + ft.getType() );
72 
73         print("获取到的成员变量名称是:" + ft.getName() );      
74 
75       }
76 
77     }
78 
79 }

<1>  

<2>

 

暴力反射:

 

 <3>获取Class对象对应类中,所有的成员变量

  (获取Person类中的name 和 age)

运行效果:

private修饰符对应的值为2:

原文地址:https://www.cnblogs.com/JasperZhao/p/14888721.html