通过反射写个“框架”
首先准备配置文件
className=com.yunji.test.Person
methodName=eat
准备两个类
Person类
package com.yunji.test;/*
@Author wanghongyuan
@Date 2021/1/22
*/
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void eat(){
System.out.println("eat.....");
}
}
Student类
package com.yunji.test;/*
@Author wanghongyuan
@Date 2021/1/25
*/
public class Student {
private String name;
public Student() {
}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
public void sleep(){
System.out.println("睡觉。。。。");
}
}
开始写执行方法
package com.yunji.test01;/*
@Author wanghongyuan
@Date 2021/1/25
*/
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/*
需求:写一个框架,前提是不改变代码的情况下,可以帮我们创建任意类对象,并且执行其中的任意方法
实现:
1.配置文件
2.反射
步骤:
1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2.在程序中加载读取配置文件
3.使用反射技术来加载类文件进内存
4.创建对象
5.执行方法
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
//1.加载配置文件
//1.1创建Properties对象
Properties pro = new Properties();
//1.2通过对象中的load,加载配置文件,转换为一个集合。
//1.2.1获取class目录下的配置文件,这样就获取了Reflect字节码文件,再调用其中的getClassloader方法,得到类加载器,由
//这个类加载器,加载进内存
ClassLoader classLoader = ReflectTest.class.getClassLoader();
//获取字节流
InputStream is = classLoader.getResourceAsStream("resources.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);
}
}
这边要注意的是配置文件中的命名一定要规范,大小写输错了就会报错
connector-java-5.1.45.jar" com.yunji.test01.ReflectTest
Exception in thread "main" java.lang.NullPointerException
at java.lang.Class.searchMethods(Class.java:3003)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at com.yunji.test01.ReflectTest.main(ReflectTest.java:46)
Process finished with exit code 1