需求:
写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法
创建Peron对象,调用eat方法
创建Student对象,调用study方法
创建Worker对象,调用work方法
解决:使用反射技术:
- 创建一个Properties集合的配置文件,里边写全类名和方法名称
Properties集合:https://blog.csdn.net/qq_45083975/article/details/90721915 - 使用Properties集合+IO流读取配置文件,获取配置文件中键值对
- 使用Properties集合中的方法getProperty,通过key获取全类名
- 使用Properties集合中的方法getProperty,通过key获取方法名称
- 使用获取到的全类名,通过反射技术获取Class文件对象
- 使用Class文件对象中的方法newInstance实例化对象
- 使用方法名称获取要执行的方法的Method对象
- 使用Method类中的方法invoke执行方法
代码实现:
Person类:
package com.ccc.demo04Reflect;
public class Person {
public void eat(){
System.out.println("人是铁,饭是钢,一顿不吃饿得慌!");
}
}
Student类:
package com.ccc.demo04Reflect;
public class Student {
public void study(){
System.out.println("作为一个程序猿,目标敲代码!");
}
}
Work类:
package com.ccc.demo04Reflect;
public class Worker {
public void work(){
System.out.println("只有敲代码,才能挣钱娶个漂亮媳妇!");
}
}
Work类:
package com.ccc.demo04Reflect;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Properties;
public class Demo01ReflectTest {
public static void main(String[] args) throws Exception {
//Person p = new Person();
//p.eat();
//1.创建一个Properties集合的配置文件,里边写全类名和方法名称
//2.使用Properties集合+IO流读取配置文件,获取配置文件中键值对
Properties prop = new Properties();
prop.load(new FileReader("day10\\prop.txt"));
//System.out.println(prop);
//3.使用Properties集合中的方法getProperty,通过key获取全类名
String className = prop.getProperty("className");
//4.使用Properties集合中的方法getProperty,通过key获取方法名称
String methodName = prop.getProperty("methodName");
//5.使用获取到的全类名,通过反射技术获取Class文件对象
Class clazz = Class.forName(className);
//6.使用Class文件对象中的方法newInstance实例化对象
Object obj = clazz.newInstance();
//7.使用方法名称获取要执行的方法的Method对象
Method method = clazz.getMethod(methodName);
//8.使用Method类中的方法invoke执行方法
method.invoke(obj);
}
}