java 27 - 4 反射之 通过反射获取成员变量并使用

类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。

 

A:获得类的成员变量 数组:

  1、getFields(公共类的)

  2、getDeclaredFields(所有类型的)

B:获得类的单个成员变量:

  1、getField (公共类的)

  2、getDeclaredField (所有类型的)

 

  A.1:获得类的公共成员变量:

1         //获取类的字节码文件对象    
2         Class c = Class.forName("zl_Relfect_01.Person");
3         
4         //获得该对象的公共成员变量
5         Field[] f = c.getFields();
6         //遍历
7         for(Field fie : f){
8             System.out.println(fie);
9         }

 

 A.2:获得类的所有成员变量:

1         //获取类的字节码文件对象    
2         Class c = Class.forName("zl_Relfect_01.Person");
3       //获取该类的所有成员变量
4         Field[] f = c.getDeclaredFields();
5         for(Field fie : f){
6             System.out.println(fie);
7         }    

 

 B.1:获得单个公共成员变量:

1         //获取类的字节码文件对象    
2         Class c = Class.forName("zl_Relfect_01.Person");
3         //获取单个公共的成员变量
4         Field f = c.getField("address");
5         System.out.println(f);

 

 B.2:获得单个所有类型的成员变量:

1         //获取类的字节码文件对象    
2         Class c = Class.forName("zl_Relfect_01.Person");
3 //        获取单个成员变量(所有类型)
4         Field f = c.getDeclaredField("name");
5         System.out.println(f);

 

 通过反射获取成员变量并使用

 1      //获取类的字节码文件对象
 2         Class c = Class.forName("zl_Relfect_01.Person");    
 3         //通过无参构造创建对象
 4         Constructor con = c.getConstructor();
 5         Object obj = con.newInstance();
 6         
 7     
 8         //获取私有成员变量name,并对它进行赋值
 9         //首先获取私有成员变量name
10         Field newname = c.getDeclaredField("name");
11         //成员变量name是私有的,所以得先取消语言访问检查  public void setAccessible(boolean flag)
12         newname.setAccessible(true);
13         //set(Object obj,Object value):将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
14         //给obj里面的newname赋值为张三
15         newname.set(obj, "张三");
16         System.out.println(obj);//Person [name=张三, age=0, address=null]
17 
18         
19         //获取默认类型成员变量age,并对它进行赋值    
20         //获取age变量,并赋值
21         Field newage = c.getDeclaredField("age");
22         //取消语言访问检查
23         newage.setAccessible(true);
24         //给age赋值
25         newage.set(obj, 13);
26         System.out.println(obj);
27         
28         
29         //获取公共成员变量address,并对它赋值    
30         //获取address对象,并赋值
31         Field newaddress = c.getDeclaredField("address");
32         newaddress.set(obj, "家乡");
33         System.out.println(obj);

 

posted @ 2016-10-16 11:25  卡拉瓦  阅读(14250)  评论(0编辑  收藏  举报