这个小案例帮助了我更深刻的理解了反射,也让我对后面框架原理有了一些新的认识,因此记录再次,希望能让更多的人看到,当然,大佬就直接跳过就好。
实体类:
Student.java
public class Student { public void love() { System.out.println("爱生活,爱Java"); } }
Teacher.java
public class Teacher { public void love() { System.out.println("爱生活,爱授课"); } }
现在需求,让你调用学生的love方法
public class Test {
public static void main(String[] args) {
Student student = new Student();
student.love();
}
}
过几天需求改了,让你调用老师的love方法,你肯定会这样
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
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