由该案例,通过对文件中键值对中值的修改,达到修改参数的目的,进而造的对象和方法不同,从而实现特定功能;总结下来就是修改配置文件从而使得不同对象执行不同的功能,从而达到快速修改程序的目的。
Student.java
/**
* @BelongsProject: JavaWeb02
* @BelongsPackage: PACKAGE_NAME
* @Auther: Yongliang Xu l1264009784@163.com
* @Date: 2021/3/11 21:04
* @Description:
* @since JDK 1.8
*/
/**
*@ClassName Student
*@Description TODO
*@Author Yongliang Xu
*@Date 2021/3/11 21:04
*@Version 1.0
*/
public class Student {
public void study(){
System.out.println("good good study,day day up!");
}
}
Teacher.java
/**
* @BelongsProject: JavaWeb02
* @BelongsPackage: PACKAGE_NAME
* @Auther: Yongliang Xu l1264009784@163.com
* @Date: 2021/3/11 21:06
* @Description:
* @since JDK 1.8
*/
/**
*@ClassName Teacher
*@Description TODO
*@Author Yongliang Xu
*@Date 2021/3/11 21:06
*@Version 1.0
*/
public class Teacher {
public void teach(){
System.out.println("授人以渔,教书育人");
}
}
a.txt
className=Teacher
methodName=teach
ReflectTest.java
/**
* @BelongsProject: JavaWeb02
* @BelongsPackage: PACKAGE_NAME
* @Auther: Yongliang Xu l1264009784@163.com
* @Date: 2021/3/11 21:08
* @Description:
* @since JDK 1.8
*/
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;
/**
*@ClassName ReflectTest
*@Description TODO
*@Author Yongliang Xu
*@Date 2021/3/11 21:08
*@Version 1.0
*/
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchMethodException, IOException {
/**
* @Author Yongliang Xu
* @Description 该程序的主要功能是执行Student类的study()方法和Teacher类的teach()方法,但是只能执行一个,如何快速切换,想执行谁就执行谁
* @Date 21:09 2021/3/11
* @Param [args]
* @Return void
**/
/*Student student = new Student();
student.study();
Teacher teacher = new Teacher();
teacher.teach();*/
/*Class<?> aClass = Class.forName("Student");//Class类的forName方法可以用把类(类的全路径字符串)转换为字节码文件;进而通过字节码文件对象获取构造器对象去造对象
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
Method study = aClass.getMethod("study");
study.invoke(o);//这部分虽然不用new对象,只需要修改参数就可以切换;主要原因就是通过字节码文件对象去获得的对象和方法*/
Properties properties = new Properties();
FileReader fileReader = new FileReader("myReflect\\a.txt");
properties.load(fileReader);
String className = properties.getProperty("className");
String methodName = properties.getProperty("methodName");//以上从文件获取配置文件中的值
Class<?> aClass = Class.forName(className);//Class类的forName方法可以用把类(类的全路径字符串)转换为字节码文件;进而通过字节码文件对象获取构造器对象去造对象
Constructor<?> constructor = aClass.getConstructor();
Object o = constructor.newInstance();
Method study = aClass.getMethod(methodName);
study.invoke(o);//进一步优化,通过修改配置文件的值实现修改参数的值
}
}