【案例12-3】:利用反射实现通过读取配置文件对类进行实例化
【案例介绍】
1.案例描述
现在有一个项目,项目中创建了一个Person类,在Person类中定义了一个sleep()方法。在工程中还定义了一个Student类继承Person类,在Student类中重写了Person类的sleep()方法。项目有一个配置文件,名称为test.properties,在配置文件中配置了一个className属性和一个methodName属性,className属性值是类的全限定类名,methodName属性值是方法名。
本案例要求通过读取配置文件对类进行实例化,具体如下:
(1)获取test.properties配置文件中的className属性值(类的全限定类名),利用反射对该类进行实例化。
(2)获取test.properties配置文件中的methodName属性值(方法名),利用反射获取对象方法,并执行该方法。
2.运行结果
情景一:
配置文件中的信息:
运行结果:
情景二:
配置文件中的信息:
运行结果:
【案例目标】
- 学会分析“利用反射实现通过读取配置文件信息信息对类进行实例化”程序任务实现的逻辑思路。
- 能够独立完成“利用反射实现通过读取配置文件信息对类进行实例化” 程序的源代码编写、编译及运行。
- 掌握反射机制的应用。
【案例分析】
(1)通过任务描述可知,需要先在工程的根目录下创建一个test.properties文件,在配置文件中配置一个className属性和一个methodName属性,className属性值是类的全限定类名,methodName属性值是方法名。
(2)然后创建两个类:Person类和Student类且Student类继承Person类。在Person类中编写一个sleep()方法,在Student类中重写Person类的sleep()方法;
(3)最后编写一个测试类ReflexTest,在main()方法中,编写程序,具体步骤描述如下:
1.利用反射加载配置文件
2.获取配置文件中的数据,获取类的全路径名及方法名
3.根据获取的类的全路径名,利用反射将该类加载进内存
4.创建该类对象
5.根据在配置文件中获取的方法名获取对象方法
6.执行方法
【案例实现】
情景一
test.properties
- className = chapter1203.Person //chapter1203是Person类所在的包名
- methodName = sleep
上述配置文件中,定义了classNmae和methodName属性并赋值。
Person.java
- package chapter1203;
- public class Student extends Person{
- @Override
- public void sleep() {
- super.sleep();
- System.out.println("呼噜呼噜~~~");
- }
- public void s1() {
- super.sleep();
- System.out.println("hello");
- }
- }
上述代码中,创建了一个Person类,并在Person类中编写了一个sleep方法。
Student.java
- public class Student extends Person{
- @Override
- public void sleep() {
- super.sleep();
- System.out.println("呼噜呼噜~~~");
- }
- public void s1() {
- super.sleep();
- System.out.println("hello");
- }
- }
上述代码中,定义了一个Student类并继承了Person类。在Student类中重写了父类Person中的sleep()方法,然后,编写了一个s1()方法。
ReflexTest.java
- import java.io.IOException;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Properties;
- public class ReflexTest {
- public static void main(String[] args) throws IOException,
- ClassNotFoundException, InstantiationException, IllegalAccessException,
- NoSuchMethodException, SecurityException, IllegalArgumentException,
- InvocationTargetException {
- /*1、加载配置文件
- * 用类名.class.getResourceAsStream("xx")或者
- * 类名.class.getClassLoader().getResourceAsStream("xx");
- *
- * */
- Properties properties = new Properties();
- properties.load(ReflexTest.class.getResourceAsStream("" +
- "test.properties"));
- //2、获取配置文件中定义的数据
- String className = properties.getProperty("className");
- String methodName = properties.getProperty("methodName");
- //3、加载该类进内存
- Class cls = Class.forName(className);
- //4、创建类对象
- Object obj = cls.newInstance();
- //5、获取对象方法
- Method method = cls.getMethod(methodName);
- //6、执行方法
- method.invoke(obj);
- }
- }
上述代码中,第15-17行代码,利用反射加载了test.properties配置文件;第19-20行代码,获取配置文件中className和methodName属性的信息;第22行代码,根据获取的类的全路径名,利用反射将该类加载进内存;第24行代码,创建在配置文件中获取的类的对象;第26行代码,根据在配置文件中获取的方法名获取对象方法;第28行,执行该方法。
情景二
只需要修改test.properties配置文件即可。
test.properties
- sclassName = chapter1203.Student
- methodName = s1