码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-31 23:33:17      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:bool   illegal   取值   oca   演示   成员变量   ack   person   sse   

1、在反射机制中,把类中的成员变量使用类Field表示;  

2、通过Class类中提供的方法获取成员变量:

  (1)返回一个成员变量

public Field getField(String name) 获取指定的 public修饰的变量
public Field getDeclaredField(String name) 获取指定的任意变量

  (2)返回多个成员变量

public Field[] getFields() 获取所有public 修饰的变量
public Field[] getDeclaredFields() 获取所有的 变量 (包含私有)

  (3)获取成员变量代码演示

 1 package cn.gzdlh_01_Reflect;
 2 
 3 import java.lang.reflect.Field;
 4 
 5 public class FieldDemo {
 6     public static void main(String[] args) throws ClassNotFoundException,
 7             NoSuchFieldException, SecurityException {
 8         // 获取Class对象
 9         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
10 
11         // 获取成员变量
12         // 多个变量
13         // Field[] fields = c.getFields();
14         Field[] fields = c.getDeclaredFields();
15         for (Field field : fields) {
16             System.out.println(field);
17         }
18         System.out.println("-----------------");
19         // 一个变量
20         // public int age;
21         Field ageField = c.getField("age");
22         System.out.println(ageField);
23 
24         // private String address
25         Field addressField = c.getDeclaredField("address");
26         System.out.println(addressField);
27     }
28 }

3、通过反射,创建对象,获取指定的成员变量,进行赋值与获取值操作

  (1)获取成员变量,步骤如下:

    ①获取Class对象;

    ②获取构造方法;

    ③通过构造方法,创建对象;

    ④获取指定的成员变量(私有成员变量,通过setAccessible(boolean flag)方法暴力访问);

    ⑤通过方法,给指定对象的指定成员变量赋值或者获取值。

public void set(Object obj, Object value)
在指定对象obj中,将此 Field 对象表示的成员变量设置为指定的新值
public Object get(Object obj)
返回指定对象obj中,此 Field 对象表示的成员变量的值

  (2)代码演示

 1 package cn.gzdlh_01_Reflect;
 2 
 3 import java.lang.reflect.Constructor;
 4 import java.lang.reflect.Field;
 5 import java.lang.reflect.InvocationTargetException;
 6 
 7 public class FieldDemo2 {
 8     public static void main(String[] args) throws ClassNotFoundException,
 9             NoSuchMethodException, SecurityException, InstantiationException,
10             IllegalAccessException, IllegalArgumentException,
11             InvocationTargetException, NoSuchFieldException {
12         // 1,获取Class对象
13         Class c = Class.forName("cn.gzdlh_01_Reflect.Person");
14         // 2,获取构造方法
15         // public Person(String name)
16         Constructor con = c.getConstructor(String.class);
17         // 3,通过构造方法,创建对象
18         Object obj = con.newInstance("gzdlh");
19         // 4,获取指定的成员变量
20         // public String name;
21         Field nameField = c.getField("name");
22         // public int age;
23         Field ageField = c.getField("age");
24         // private String address;
25         Field addressField = c.getDeclaredField("address");
26         addressField.setAccessible(true); // 取消 Java 语言访问检查
27 
28         // 5,通过方法,给指定对象的指定成员变量赋值或者获取值
29         System.out.println("name = " + nameField.get(obj));
30         System.out.println("age = " + ageField.get(obj));
31         System.out.println("address = " + addressField.get(obj));
32 
33         // 赋值
34         ageField.set(obj, 23);
35         addressField.set(obj, "广州信息港");
36 
37         System.out.println("------------------------");
38         System.out.println("name = " + nameField.get(obj));
39         System.out.println("age = " + ageField.get(obj));
40         System.out.println("address = " + addressField.get(obj));
41     }
42 }

 

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

标签:bool   illegal   取值   oca   演示   成员变量   ack   person   sse   

原文地址:https://www.cnblogs.com/gzdlh/p/8159239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!