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

Posted Lamfai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了00112_通过反射获取成员变量并使用相关的知识,希望对你有一定的参考价值。

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_通过反射获取成员变量并使用的主要内容,如果未能解决你的问题,请参考以下文章

00113_通过反射获取成员方法并使用

[Java基础]反射获取成员变量并使用

[Java基础]反射获取成员变量并使用练习

day21-反射&枚举

day21-反射&枚举

day21-反射&枚举