Java反射学习步骤:
1、 什么是反射机制?
2、 获取字节码文件对象(class)
3、 (Consrtuctor)用字节码对象(class) new一个对象
4、 获取和设置字段(Field)对象的值
5、获取指定class的函数(Method)并对其调用
6、反射实例
反射实例
New了一个Mainboard的类
package reflect.test;
/*反射四要素:
* 1、服务器
* 2、接口
* 3、要进行反射的类
* 4、配置文件
*
* 反射实例简介:
* 在Mainboard(主板:相当于一个Tomcat服务器)中,
* 对Implements了PCI(接口)的NetCard(网卡)和SoundCard(声卡)
* 在只获取(从配置文件获取)它们的字符串条件下进行调用。
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
publicclass ReflectTest {
publicstaticvoidmain(String[] args) throws IOException, Exception {
Mainboard mb=newMainboard();
mb.run();
/*
*
* 问题:
* 每次添加一个设备都需要修改代码传递一个新创建的对象
* mb.usePCi(newSoundCard());
* 能不能不修改代码就完成这个动作?
*需求:
* 不用new来完成,而是只获取其class文件。在内部实现创建对象的动作。
*
*
*/
File configFile =new File("pci.properties");
Properties prop=newProperties();
FileInputStream fis=newFileInputStream(configFile);
prop.load(fis);
for(intx=0;x<prop.size();x++) {
//知识点
StringpciName=prop.getProperty("pci"+(x+1));//获取类名的字符串。
Classclazz=Class.forName(pciName);//class对象是实现了PCI接口的类。
PCIp=(PCI)clazz.newInstance();//PCI该类还有PCI接口的所有方法,但不还有其它方法。
mb.usePCi(p);//运行。
}
fis.close();
}
}
接口:
package reflect.test;
publicinterface PCI {
publicvoid open();
public void close() ;
}
主板:
package reflect.test;
publicclass Mainboard {
publicvoid run(){
System.out.println("main board run....");
}
publicvoidusePCi(PCI p) {//PCIp=new soundCard();
if(p!=null) {
p.open();
p.close();
}
}
}
声卡:
package reflect.test;
publicclass SoundCard implements PCI {
publicvoid open(){
System.out.println("sound open");
}
publicvoidclose() {
System.out.println("sound close");
}
}
网卡:
package reflect.test;
publicclass NetCard implements PCI {
@Override
publicvoid open(){
System.out.println("net open");
}
@Override
publicvoidclose() {
System.out.println("net close");
}
}