通过反射运行配置文件中指定文件的指定方法(练习)

先建立两个测试类:Teacher和Student

package com.反射练习01;

public class Teacher {
    public void teach(){
        System.out.println("老师教课");
    }
}
package com.反射练习01;

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

建立一个class.txt文件,里面书写配置,
可以通过改变class文件中的配置内容来改变引用类名,方法名

className=com.反射练习01.Teacher
methodName=teach

书写执行代码:

package com.反射练习01;

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

public class main {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //FileReader(String fileName)    创建一个新的FileReader,给定要读取的文件名称
        FileReader fr = new FileReader("E:\\IDEA_project\\idea_test\\com.idea_primary\\src\\com\\反射练习01\\class.txt");
        //特殊操作流Properties:是一个Map体系的集合类;可以保存到流中或从流中加载
        Properties pp = new Properties();
        //void    [Properties].load(InputStream inStream)    从输入字节流读取属性列表 (键和元素对)
        pp.load(fr);
        fr.close();
        //String    [Properties].getProperty(String key)    根据键,获取值
        String className = pp.getProperty("className");
        String methodName = pp.getProperty("methodName");
        //Class.forName([类的路径])
        //使用class类的静态方法forName(),用类的名字获取一个class实例,即根据类的字符串名称可以获得Class实例,可以动态的加载类。
        Class<?> aClass = Class.forName(className);
        //Constructor<T>    [class].getConstructor(Class<?>... parameterTypes)
        //返回一个Constructor对象,该对象反映此Class 对象表示的类的指定公共构造方法
        //  (Class<?>... parameterTypes):要获取的参数方法的参数的个数和数据类型对应的字节码文件对象
        //  基本数据类型也可以通过.class得到对应的Class类型
        Constructor<?> con = aClass.getConstructor();
        //T    [Constructor].newInstance(Object... initargs)
        //使用此Constructor对象表示的构造函数,使用指定的初始化参数来创建和初始化构造函数的声明类的新实例
        Object o = con.newInstance();
        //Method    [Class].getMethod(String name, Class<?>... parameterTypes)
        //返回一个Method对象,该对象反映此Class对象表示的类或接口的指定公共成员方法,没有参数可以省略“, Class<?>... parameterTypes”
        Method m = aClass.getMethod(methodName);
        //Object    [Method].invoke(Object obj, Object... args)
        //在Method 具有指定参数的指定对象上调用此对象表示的基础方法,invoke参数类型对应getMehod方法的参数类型
        m.invoke(o);
    }
}

输出台输出:

老师教课

posted @ 2021-03-03 00:04  丰北丰  阅读(86)  评论(0)    收藏  举报