一个经典的反射应用场景:
1. 三个Java文件,分别叫servlet1.java,servlet2.java,servlet3.java,每个文件中各自有一个构造函数,当类被用来new一个新对象时,会自动调用这个构造函数
//servlet1.java public class servlet1 { public servlet1() { System.out.println("我是servlet1"); } }
//servlet2.java
public class servlet2 { public servlet2() { System.out.println("我是servlet2"); } }
//servlet3.java
public class servlet3 { public servlet3() { System.out.println("我是servlet3"); } }
2.然后有一个配置文件.properties文件 三个key-value键值对
aaaa=servlet1 bbbb=servlet2 cccc=servlet3
3.通过反射机制来创建对象
Scanner s=new Scanner(System.in); String key=s.nextLine();//输入key,然后后面就可以用Propertie对象查找 //将properties文件里的键值对添加到Properties对象(一个hashmap)里 FileReader reader=new FileReader("D:\\桌面\\Java代码 \\djbServlet\\test.properties"); Properties pro=new Properties(); pro.load(reader); reader.close(); String className=pro.getProperty(key);//通过key得到对应的那个servlet名字 (字符串) //通过反射机制创建对象 Class a=Class.forName(className); Object b=a.newInstance();
最后如果你输入 aaaa,运行程序会输出:我是servlet1(因为创建了一个servlet1类的对象)
最后如果你输入 bbbb,运行程序会输出:我是servlet2(因为创建了一个servlet2类的对象)
最后如果你输入cccc,运行程序会输出:我是servlet3(因为创建了一个servlet3类的对象)
总结:
比如有一个Person类,我利用这个类new了一个对象xiaoming
然后有个hashmap里面有这样一个键值对(key和value都是字符串String):xiaoming=Person,表示小明这个对象是属于Person类的
String value=map.get(key);//key是“xiaoming”,value是“Person”,都是字符串
Class a=Class.forName(value);
Object xiaohong=a.newInstance();//成功的new了一个Person类对象xiaohong