需求:
写一个“框架”,在不能改变该类的任何代码的前提下,可以创建任意类的对象,并且执行其中任意方法
实现:
- 配置文件
- 反射
步骤:
- 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 在程序中加载读取配置文件
- 使用反射技术来加载类文件进内存
- 创建对象
- 执行方法
目录结构:
代码实现:
- Student.java
package domain;
public class Student {
public void sleep() {
System.out.println("sleep...");
}
}
- Person.java
package domain;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("eat...");
}
}
- ReflectDemo2.java
package reflect;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
public class ReflectDemo2 {
public static void main(String[] args) throws Exception {
// 1.加载配置文件
// 1.1 创建properties对象
Properties pro = new Properties();
// 1.2 加载配置文件,转换为一个集合
// 1.2.1 获取class目录下的配置文件
ClassLoader classLoader = ReflectDemo2.class.getClassLoader(); // 类加载器
InputStream is = classLoader.getResourceAsStream("pro.properties");
pro.load(is);
// 2. 获取配置文件中定义的数据
String className = pro.getProperty("className");
String methodName = pro.getProperty("methodName");
// 3. 加载该类进内存
Class cls = Class.forName(className);
// 4. 创建对象
Object obj = cls.newInstance();
// 5. 获取方法对象
Method method = cls.getMethod(methodName);
// 6. 执行方法
method.invoke(obj);
}
}
运行结果:
- 配置文件 pro.properties为
className=domain.Student
methodName=sleep
- 配置文件pro.properties为
className=domain.Person
methodName=eat
即修改配置文件可运行不同程序