您的位置:首页 > 编程语言 > Java开发

JAVA反射机制入门

2015-06-19 20:19 501 查看
(注:由于XML还没学,这里使用的是配置文件Properties,)

这几天,刚看了一些关于反射机制的东西。觉得挺高大上的,而且特别的适用于程序的扩展。什么是反射机制??

举个例子,假如有一台电脑,电脑中有主板和PCI扩展槽接口。这个PCI扩展接口为我们的声卡、网卡、显卡等都预留了接口。只要我们插上了声卡,其实电脑的内部是有声卡的驱动程序的(或者在插上声卡的瞬间,会在网上在线的下载),这时电脑就会给这种型号的声卡匹配对应的驱动程序。在这个过程中我们的cpu会先获得声卡的型号,接着会在电脑自己的驱动程序库中来进行相应的匹配。等到匹配上了之后,就会立即安装该型号的声卡的驱动。如果没匹配上那怎么办??(其实会在线下载来扩充驱动程序库的,所以肯定会匹配上的。)这时候声卡就可以使用了,同理显卡也是同样的道理。在这个过程中,cpu获取声卡的型号来匹配相应的驱动程序的过程就是一个简单的反射机制。

反射的定义:能够分析类能力的程序称为反射。

下面举一个和上面一样的例子,只不过这次使用的是java代码写的。

//这是主板CPU上运行程序
package reflector;

public class Mainborder {
public void run(){
System.out.println("Mainborder run");
}
public void usePCI(PCI p){
if(p!=null){
p.open();
p.close();
}
}
}


//这段代码类似于上面提到的PCI接口,
//凡是声卡、网卡之类的必须要继承这个接口
package reflector;

public interface PCI {
public void open();
public void close();
}


//这是声卡驱动程序的代码,只要插上对应型号的声卡
//CPU在加载这段程序,声卡就可以工作
package reflector;

public class soundCard implements PCI{

@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("soundCard open");
}

@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("soundCard close");
}

}


////这是网卡驱动程序的代码,只要插上对应型号的声卡
//CPU在加载这段程序,网卡就可以工作
package reflector;

public class netCard implements PCI{

@Override
public void open() {
// TODO Auto-generated method stub
System.out.println("netCard open");
}

@Override
public void close() {
// TODO Auto-generated method stub
System.out.println("netCard close");
}

}




//这个PCI.properties文件很重要。,它里面的内容如下:

pci1=reflector.soundCard
pci2=reflector.netCard

注意:没有每个后面均没有符号,同时右边的就是项目中相应的类

这个文件就有点像PCI口将要插的硬件。这里添加的是声卡和网卡,如果还有其他的就在后面继续添加。

//接下来就是测试代码,用来演示整个声卡插入电脑后,安装驱动再到正常工作的做个流程。

package reflector;
import java.io.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;

/*电脑运行机制*/
/*
* 这段代码主要就是测试反射的用法
* 1、添加一个电脑主板的类,可以让主板运行
* 2、那么如何添加声卡、网卡之类的测试程序就比较的麻烦?特别是如果不知道还要添加什么的情况下,就更不知道该
* 如何处理代码了?
* 解决方法??1、定义一个PCI接口,给一般常用的硬件添加驱动的程序。如:添加一个soundCard,要继承PCI接口。同时要覆盖PCI接口的方法。
* 			  2、能不能不使用new的方法,只要获取到class文件,就可以实现在内部创建对象的动作。
* 具体的操作:1、定义一个配置文件,用来读取要添加的硬件。pci1=reflector.soundCard  pci2=reflector.netCard。注意要给源加上类包名。
* 			2、首先加载这个配置文件xxx.properties。
* 			3、定义一个properties对象,
* 			4、获取配置文件的输入流FileInputStream。
* 			5、将该输入流加载到properties对象中。使用load方法
* 			6、使用for循环来遍历prp对象中的键值对,使用getproperties(key)方法获取到相应的value。
* 			7、通过class.forname(value)来得到这个对象,最后使用newIncetance()来产生对象
*
*/
public class reflectTest {

public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Mainborder mb=new Mainborder();
mb.run();
//	mb.usePCI(new soundCard());//每次这样的调用是很繁琐的。

/*能不能不使用new的方法,只要获取到class文件,就可以实现在内部创建对象的动作。
* 具体的操作:1、定义一个配置文件,用来读取要添加的硬件。pci1=reflector.soundCard  pci2=reflector.netCard。注意要加上类包名。
* 			2、首先加载这个配置文件xxx.properties。
* 			3、定义一个properties对象,
* 			4、获取配置文件的输入流。
* 			5、将该输入流加载到properties对象中。
* 			6、使用for循环来遍历prp对象中的键值对,使用getproperties(key)方法获取到相应的value。
* 			7、通过class.forname(value)来得到这个对象,最后使用newIncetance()来产生对象
* */
//定义一个配置文件,用来读取要添加的硬件
File file=new File("PCI.properties");
//定义一个properties对象
Properties prp=new Properties();
//获取配置文件的输入流
FileInputStream fis=new FileInputStream(file);
//将输入流加载到properties对象中
prp.load(fis);

//使用for循环来遍历prp对象中的键值对,使用getproperties(key)方法获取到相应的value。
for(int i=0;i<prp.size();i++){
String value=prp.getProperty("pci"+(i+1));//获取第一个硬件
Class clazz=Class.forName(value);//为这个硬件匹配驱动程序

//使用newIncetance()来产生对象
PCI p=(PCI)clazz.newInstance();//一旦匹配成功,这声卡驱动安装成功,可使用

mb.usePCI(p);
}
fis.close();

}

}


测试结果:

Mainborder run
soundCard open
soundCard close
netCard open
netCard close

这只是反射入门的最基本的例子,感兴趣的可以继续的扩展代码。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: