这个例子中,我们利用反射技术,通过修改配置文件,来替换运行的类。
项目目录结构
1 读取配置文件,生成对应的
public class Student {
public void show(){
System.out.println("is show()");
}
}
配置文件pro.txt中的内容如下
className=Student
methodName=show
测试的代码如下:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Properties;
/*
* 我们利用反射和配置文件,可以使:应用程序更新时,对源码无需进行任何修改
* 我们只需要将新类发送给客户端,并修改配置文件即可
*/
public class Main {
public static void main(String[] args) throws Exception {
//通过反射获取Class对象
Class stuClass = Class.forName(getValue("className"));//"cn.fanshe.Student"
//2获取show()方法
Method m = stuClass.getMethod(getValue("methodName"));//show
//3.调用show()方法
m.invoke(stuClass.getConstructor().newInstance());
}
//此方法接收一个key,在配置文件中获取相应的value
public static String getValue(String key) throws IOException{
Properties pro = new Properties();//获取配置文件的对象
FileReader in = new FileReader("pro.txt");//获取输入流
pro.load(in);//将流加载到配置文件对象中
in.close();
return pro.getProperty(key);//返回根据key获取的value值
}
}
运行结果如下:
2 通过修改配置文件,替换使用的类
当我们升级这个系统时,不要Student类,而需要新写一个Student2的类。这时只需要更改pro.txt的文件内容就可以了。代码就一点不用改动。
要替换的student2类:
public class Student2 {
public void show2(){
System.out.println("is show2()");
}
}
修改后的pro.txt文件
className=Student2
methodName=show2
新的运行结果:
反射的概述
使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码).
利用反射技术可以对一个类进行解剖,把个个组成部分映射成一个个对象。
Class对象的来源:将class文件读入内存后,会创建一个Class对象。