反射的作用

文章介绍了如何使用Java反射机制获取类中的所有信息,包括私有字段,然后动态创建对象并调用指定的方法。示例中涉及了从Properties文件读取配置信息,用于决定调用哪个类的方法。
摘要由CSDN通过智能技术生成

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑

  2. 结合配置文件,动态的创建对象并调用方法

练习1:

image.png

public class MyTest {
    public static void main(String[] args) throws IllegalAccessException, IOException {
        
        Student s = new Student("小A", 23, '女', 167.5, "睡觉");
        Teacher t = new Teacher("播妞", 10000);
        //调用方法
        upload(t);
    }

    private static void upload(Object obj) throws IllegalAccessException, IOException {
        //1创建字节码文件
        Class<?> clazz = obj.getClass();

        //2.创建io流
        BufferedWriter bw = new BufferedWriter(new FileWriter("..\\reflect\\a.txt"));
        //获取所有成员变量
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //暴力反射:因为成员变量有可能是私有化
            field.setAccessible(true);
            //获取变量名
            String name = field.getName();
            //获取变量在对象中记录的值
            Object value = field.get(obj);
            //写入文件
            bw.write(name + "=" + value);
            bw.newLine();
        }
        bw.close();
    }
}

image.png

练习二:

image.png

//Student
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void study(){
        System.out.println("学生在学习!");
    }

   //set、get、toString
}
//Teacher
public class Teacher {
    private String name;
    private double salary;

    public Teacher() {
    }

    public Teacher(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public void teach(){
        System.out.println("老师在教书!");
    }

  // set、get、toString
}

//main
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {


        //1.获取properties文件内的数据
        Properties prop = new Properties();
        FileInputStream fis=new FileInputStream("..\\reflect\\Info.properties");
        prop.load(fis);
        fis.close();
        System.out.println(prop);//{method=study, className=reflectDemo.Student}

        //根据键获取值
        String className = (String) prop.get("className");
        String methodName = (String)prop.get("method");

        //根据全类名获取class文件对象
        Class<?> clazz = Class.forName(className);
        //反射获取构造方法,创建一个对象o
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        Object o = constructor.newInstance();
        //反射获取方法,参数是方法名
        Method method = clazz.getDeclaredMethod(methodName);
        //因为不知道方法是不是私有化,所以暴力反射
        method.setAccessible(true);
        //传入对象运行当前方法
        method.invoke(o);//学生在学习!


    }
}

准备一个info.properties文件,以键值对的形式存储
image.png
以后若要运行其他类里面的方法,在文件内修改数据即可
image.png
将文件修改为如下,再次运行
image.png
在这里插入图片描述

总结:
Snipaste_2024-02-18_16-26-37.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值