通过反射运行配置文件中指定文件的指定方法(练习)
先建立两个测试类: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);
}
}
输出台输出:
老师教课

浙公网安备 33010602011771号