我也刚学反射,看视频学着写
模拟主板上插插件
首先,主板是需要提供接口的,那就先来个PCI接口,写的不完善,应该再加个接收插件的方法的
- package api.ReflectDemo;
- public interface PCI {
- public void open();
- public void close();
- }
复制代码
然后来个 主板,实现构造函数接收PCI接口实现类
- package api.ReflectDemo;
- //主板类 用于运行各插件
- public class MainBoard{
- MainBoard(){
- System.out.println("Main Board running....");
- }
- MainBoard(PCI p){
- this();
- p.close();
- p.open();
- }
- }
复制代码
接着,模拟主板添插件过程,通过反射实现,这样以后不用修改代码,只需要往配置文件里添加接口实现类的实现信息,就可以直接运行了相应功能了
- package api.ReflectDemo;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.lang.reflect.Constructor;
- import java.util.Properties;
- public class ReflectTest {
- /*
- * 反射 模拟电脑主板
- * 电脑主板提供接口
- * 通过配置文件添加内容实现插件插入接口
- *
- */
- public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException {
- // TODO Auto-generated method stub
- Properties p = new Properties();
- FileInputStream fis = new FileInputStream("MainBoardInterface.properties");
- p.load(fis);
-
- for(int i = 0;i<p.size();i++){
- String value = p.getProperty("pci"+(i+1));
- @SuppressWarnings("unchecked")
- Class<PCI> clzz = (Class<PCI>) Class.forName(value);
- new MainBoard(clzz.newInstance());
-
- }
-
- }
- }
复制代码
接下来,做个插件试试
- package api.ReflectDemo;
- public class Sound implements PCI {
- @Override
- public void open() {
- // TODO Auto-generated method stub
- System.out.println("Sound running .....");
- }
- @Override
- public void close() {
- // TODO Auto-generated method stub
- System.out.println("Sound close .....");
- }
- }
复制代码
别忘了配置文件
- pci1 = api.ReflectDemo.Sound
复制代码
好了,可以运行了。
这一串代码说明了反射的奇妙用途
|