反射获取成员变量并使用

Posted pxy-1999

tags:

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

技术图片

Field[] getFields() 返回包含一个数组Field对象反射由此表示的类或接口的所有可访问的公共字段类对象

public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取Class对象
        Class<?> c = Class.forName("com.reflect_02.Student");

        //Field[] getFields()
        //返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段类对象。
        Field[] fields = c.getFields();
        for (Field field : fields){
            System.out.println(field);
        }
    }
}

该方法运行结果

技术图片

Field[] getDeclaredFields()  返回的数组Field对象反映此表示的类或接口声明的所有字段类对象
public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException {
        //获取Class对象
        Class<?> c = Class.forName("com.reflect_02.Student");

        //Field[] getDeclaredFields()
        //返回的数组Field对象反映此表示的类或接口声明的所有字段类对象。
        Field[] fields = c.getDeclaredFields();
        for (Field field : fields){
            System.out.println(field);
        }
    }
}

该方法的运行结果:

技术图片

获取单个公共访问权限的成员变量的对象的方法

公共对象:Field getField(String name)  返回一个Field对象,它反映此表示的类或接口的指定公共成员字段类对象

先通过getConstructor()方法来获取构造方法,然后通过 构造方法.newInstance()方法来创建对象,通过getField()方法来获取成员变量,最后通过set()方法来为成员变量赋值,set赋值给的是构造方法所创建的对象的成员变量。

public class ReflectDemo01 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //获取Class对象
        Class<?> c = Class.forName("com.reflect_02.Student");

        //Field getField(String name)
        //返回一个Field对象,它反映此表示的类或接口的指定公共成员字段 类对象。
        Constructor<?> con = c.getConstructor();
        Object obj = con.newInstance();

        Field addressField = c.getField("address");
        addressField.set(obj,"西安"); //给obj的成员变量address赋值为 西安
        System.out.println(obj);
    }
}

获取单个任意访问权限的成员变量的对象的方法:

Field getDeclaredField(String name)  返回一个Field对象,它反映此表示的类或接口的指定已声明字段类对象

同样,在获取私有访问权限时,需要取消访问检查

 1 public class ReflectDemo01 {
 2     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
 3         //获取Class对象
 4         Class<?> c = Class.forName("com.reflect_02.Student");
 5 
 6         Constructor<?> con = c.getConstructor();
 7         Object obj = con.newInstance();
 8 
 9         //Field getDeclaredField(String name)
10         //返回一个 Field对象,它反映此表示的类或接口的指定已声明字段 类对象。
11         Field nameFiled = c.getDeclaredField("name");
12         nameFiled.setAccessible(true);
13         nameFiled.set(obj,"林青霞");
14         System.out.println(obj);
15     }
16 }

技术图片

以上是关于反射获取成员变量并使用的主要内容,如果未能解决你的问题,请参考以下文章

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

Java反射机制详解

JavaSE-24.2.3反射获取成员变量并使用

反射获取成员变量并使用

反射获取成员变量,并修改值

java反射--获取成员变量信息