反射的好处:通过读取配置文件拿到类的全路径和方法,可以不改变代码的前提下,创建任意对象,调用任意方法。

测试student类如图:

 

 配置文件如图:

 

 运行如图:

 

 测试代码如下:

package com.java.day31UseReflect;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

// 不改变任意代码前提下,创建任意对象,并执行任意方法
// 步骤 配置文件和反射
public class UseReflect {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        // 加载配置文件
        Properties pro = new Properties();
        ClassLoader classLoader = UseReflect.class.getClassLoader();
        // 找到文件路径,加载文件
        InputStream stream = classLoader.getResourceAsStream("conf.properties");
        pro.load(stream);
        // 读取配置文件,拿到类路径和方法
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");
        // 拿到字节码,加载进内存
        Class<?> c1 = Class.forName(className);
        // 创建对象
        Object obj = c1.newInstance();
        // 获取方法对象
        Method c1Method = c1.getMethod(methodName);
        // 调用方法执行
        c1Method.invoke(obj);


    }
}