这个小案例帮助了我更深入的理解了反射,也让我对后面框架原理有了一些新的认识,所以记录再次,但愿能让更多的人看到,固然,大佬就直接跳过就好。java
实体类:框架
Student.javacode
public class Student {
public void love() {
System.out.println("爱生活,爱Java");
}
}
Teacher.java get
public class Teacher {
public void love() {
System.out.println("爱生活,爱授课");
}
}
如今需求,让你调用学生的love方法io
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.love();
}
}
过几天需求改了,让你调用老师的love方法,你确定会这样class
public class Test {
public static void main(String[] args) {
// Student student = new Student();
// student.love();
Teacher teacher = new Teacher();
teacher.love();
}
}
若是需求又改,那么你又须要修改代码,这样就会形成频繁修代码的麻烦。原理
如今咱们用反射来作看看他的便捷,一般反射都有配置文件配合使用,咱们这里用class.txt来代替配置文件,配置文件一般用键值对的形式存在。配置
class.txt object
className=bean.Teacher
methodName=love
public class Test {
public static void main(String[] args) throws Exception {
// 反射前的作法
// Student student = new Student();
// student.love();
// Teacher teacher = new Teacher();
// teacher.love();
// 反射后作法
// 加载键值对数据
Properties prop = new Properties();
FileReader fr = new FileReader("class.txt");
prop.load(fr);
fr.close();
// 获取数据
String className = prop.getProperty("className");
String methodName = prop.getProperty("methodName");
// 反射
Class> c = Class.forName(className);
Constructor> con = c.getDeclaredConstructor();
Object object = con.newInstance();
Method method = c.getMethod(methodName);
method.invoke(object);
}
}
若是后续有什么变化,能够直接修改配置文件。好比如今我要学生的love方法,只需修改配置文件便可反射
className=bean.Student
methodName=love