一、反射应用场景
二、一个小demo实现
1、MainBoard.java
/**
* @Title: MainBoard.java
* @Package com.lh.reflection.test
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:09:29
* @version V1.0
*/
package com.lh.reflection.test;
import java.util.Objects;
/**
* @ClassName: MainBoard
* @Description: 主板
* @author Liu
* @date 2018年1月24日 上午9:09:29
*
*/
public class MainBoard {
public void run(){
System.out.println("主板运行...");
}
// public void useSound(SoundCard soundCard){
// soundCard.open();
// soundCard.close();
// }
public void usePCI(PCI pci){
if(Objects.nonNull(pci)){
pci.open();
pci.close();
}
}
}
2、PCI.java
/**
* @Title: PCI.java
* @Package com.lh.reflection.test
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:16:37
* @version V1.0
*/
package com.lh.reflection.test;
/**
* @ClassName: PCI
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:16:37
*
*/
public interface PCI {
void open();
void close();
}
3、SoundCard.java
/**
* @Title: SoundCard.java
* @Package com.lh.reflection.test
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:12:24
* @version V1.0
*/
package com.lh.reflection.test;
/**
* @ClassName: SoundCard
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:12:24
*
*/
public class SoundCard implements PCI{
public void open(){
System.out.println("sound open...");
}
public void close(){
System.out.println("sound open...");
}
}
4、NetCard.java
/**
* @Title: NetCard.java
* @Package com.lh.reflection.test
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:46:43
* @version V1.0
*/
package com.lh.reflection.test;
/**
* @ClassName: NetCard
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:46:43
*
*/
public class NetCard implements PCI {
/* (非 Javadoc)
* <p>Title: open</p>
* <p>Description: </p>
* @see com.lh.reflection.test.PCI#open()
*/
public void open() {
System.out.println("Net open...");
}
/* (非 Javadoc)
* <p>Title: close</p>
* <p>Description: </p>
* @see com.lh.reflection.test.PCI#close()
*/
public void close() {
System.out.println("Net close...");
}
}
5、ReflectTest.java
/**
* @Title: ReflectTest.java
* @Package com.lh.reflection.test
* @Description: TODO
* @author Liu
* @date 2018年1月24日 上午9:09:12
* @version V1.0
*/
package com.lh.reflection.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
/**
* @ClassName: ReflectTest
* @Description: 电脑运行
* @author Liu
* @date 2018年1月24日 上午9:09:12
*
*/
public class ReflectTest {
/**
* @throws Exception
* @throws IOException *
* @Title: main
* @Description: TODO
* @param @param args
* @return void
* @throws
*/
public static void main(String[] args) throws Exception {
MainBoard mainBoard = new MainBoard();
mainBoard.run();
//每次添加一个新设备都需要修改代码传递一个新创建的对象
// mainBoard.usePCI(new SoundCard());
//能否不修改代码就可以完成这个动作?
//不用new来完成,而是获取class文件,在内部实现创建对象的动作
File configFile = new File("pci.properties");
InputStream is = new FileInputStream(configFile);
//Properties实现了Map接口
Properties prop = new Properties();
prop.load(is);
for(int i = 0; i < prop.size(); i++){
String pciName = prop.getProperty("pci" + (i + 1));
Class clazz = Class.forName(pciName);
PCI pci = (PCI) clazz.newInstance();
mainBoard.usePCI(pci);
}
is.close();
}
}
6、pci.properties
pci1=com.lh.reflection.test.SoundCard
pci2=com.lh.reflection.test.NetCard