版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/han_xiaoxue/article/details/79227680
Java反射机制实在运行状态中,对任意一个类,都能够知道这个类的属性和方法。
这种动态调用方法和获取信息的功能可以被称为java的反射机制。
好处显而易见,提高应用程序的扩展性。
说的通俗一点,就是你在开发时候,不知道未来可能会需要添加什么新功能,但是你又比较懒,希望添加新功能后,尽可能少的更改原代码。最好不要改变原始逻辑。那在这种,你并不知道未来会发生什么的情况下,怎么办呢,用反射。
先用图展现下反射的原理。
举个栗子:
假如你有一个动物园,你刚开办动物园的时候,动物并不多,只有一条狗。
那你这样写:
public class Zoo {
public void run(){
dog d = new dog();
d.eat();
d.sleep();
}
}
过几天你又有一只猫,你怎么办?
那你的代码可能得这样了:
public class Zoo {
public void run(){
dog d = new dog();
d.eat();
d.sleep();
cat c = new cat();
c.eat();
c.sleep();
}
}
过几天你又有了猴子、老虎。。。又来了一百个动物,你还这样么?写一百遍?
那当然不能啊。
那么我们就可以用反射,来实现。首先你弄个接口,叫AnimalInterface,无论是狗还是猫,都是动物啊。
public interface AnimalInterface {
public void eat();
public void sleep();
}
然后你让狗实现这个接口。
public class dog implements AnimalInterface {
@Override
public void sleep() {
System.out.println("dog sleeping...");
}
@Override
public void eat() {
System.out.println("dog eating...");
}
}
然后,你的动物园,就可以用多态了啊。
public class Zoo {
public void run(AnimalInterface animal){
animal.eat();
animal.sleep();
}
}
配置文件里,放你需要跑的类名。以逗号隔开
list=net.hxxtest.fanshedemo.impleClass.dog,net.hxxtest.fanshedemo.impleClass.cat
下面看一下主函数
public static void main(String[] args)throws Exception{
Zoo z = new Zoo();//创建你的动物园
//读取配置文件
ResourceBundle rb = ResourceBundle.getBundle("animalsFile");
String animalList = rb.getString("list");
String[] strArray = animalList.split(",");
//将你添加的动物,遍历出来
for(int i=0;i<strArray.length;i++){
String animalName= strArray[i];
//找寻该动物类文件,并加载进内存,产生class对象
Class c = Class.forName(animalName);
//生成该动物对象
AnimalInterface obj = (AnimalInterface)c.newInstance();
z.run(obj);
}
}
代码改成这样之后,就可以保证,你新添加动物时,不用改任何代码,只需要在配置文件上,假如你新增的动物就OK了。