通过反射调用成员变量

获取 Class 类中的字段(更多请查看JDK文档,关键字:Class)

  • Field getField(String name)  返回类中某个 公共字段
  • Field[] getFields()  返回类中 所有公共字段 [ ]
  • Field getDeclaredField(String name)  返回类中 任意某个字段
  • Field[] getDeclaredFields()  返回类中 所有字段 [ ]

Student类、class.properties文件代码看这:反射创建实例对象 - 鹿先森JIAN - 博客园 (cnblogs.com)

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Properties properties = new Properties();
        FileInputStream fis = new FileInputStream("day14\\class.properties");
        properties.load(fis);

        //2.从集合中,把className的信息获取到
        String className = properties.getProperty("className"); // 类路径名

        //3.反射根据类的全路径(包名 + 类名),将当前的类加载进内存,形参Class类对象
        Class<?> c = Class.forName(className);

        System.out.println("getField(String name) 返回类中某个 公共字段---------------");
        Field tel = c.getField("tel");  // 比如获取字段 tel
        System.out.println(tel);

        System.out.println("getDeclaredField(String name) 返回类中 任意某个字段------------");
        Field name = c.getDeclaredField("name");
        System.out.println(name);

        System.out.println("getFields() 返回类中 所有公共字段[]------------");
        Field[] fields = c.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        System.out.println("getDeclaredFields() 返回类中 所有字段[]-------------");
        Field[] declaredFields = c.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

// 读取配置文件的做法
        String fieldName = properties.getProperty("fieldName"); // (字段名)
        String fieldValue = properties.getProperty("fieldValue");   // (字段名对应的值)

        Field fName = c.getDeclaredField(fieldName);
        fName.setAccessible(true);

        Constructor<?> constructor = c.getConstructor();
        Object o = constructor.newInstance();   // 创建对象,默认调用该类的无参构造方法

        fName.set(o,fieldValue); // 赋值
        Object fValue = fName.get(o);    // 取值
        System.out.println(fValue);
    }
}

 

posted @ 2022-07-15 20:02  鹿先森JIAN  阅读(44)  评论(0编辑  收藏  举报