博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于JAVA的反射机制
阅读量:6906 次
发布时间:2019-06-27

本文共 2858 字,大约阅读时间需要 9 分钟。

hot3.png

在不改动源程序的情况下,可以通过对外提供配置文件的形式。

    /*

   *
   * 需求:笔记本电脑运行。
   * 增加需求:想使用一个鼠标。
   * 可以对鼠标进行描述。
   * 并在笔记本中定一个使用鼠标的方法。
   * public void useMouse(Mouse m){
    m.open();
    m.close();
   }
   虽然这样可以运行,但是日后如果在有其他设备比如摄像头等设备,还是修改笔记本类。
   不利于扩展。
   
   * 该程序在定义时并未考虑扩展性。
   *
   *
   * 以后出现的功能会有很多。而且未知。
   * 为了降低后期设备和笔记本的耦合性。
   * 在前期应该先定义规则。笔记本使用这个规则,后期的设备只要符合这个规则笔记本就可以使用。
   *
   * 定义规则:
   * 只要是符合usb规范的设备笔记本都可以用。
   * 在描述笔记本。
   *
   *
   * 后期,要使用鼠标。
   * 该鼠标必须符合usb的规则。
   * 描述鼠标实现USB接口,并将鼠标对象作为参数传递给笔记本即可。
   *
   * 但是对于一个已经可以运行的应用程序,不建议在改动它的源码。
   *
   * 为了进一步提高扩展性,对于未知子类可以通过反射技术来完成。
   * 哪就必须在编写该应用程序时,加入反射机制。
   *
   *
   *
   */
  NoteBook book = new NoteBook();
  book.run();
  book.useUSB(null);
//  book.useUSB(new MouseByUSB());
  
  /*
   * 后期设备不确定,可以作为参数传递,
   * 参数如何获取呢?
   * 在不改动源程序的情况下,可以通过对外提供配置文件的形式。
   *
   */
  
  
  //1,定义一个配置文件对象。
  File configFile = new File("temp\\usb.properties");
  if(!configFile.exists()){
   configFile.createNewFile();
  }
  
  //读取配置文件中的信息。
  
  Properties prop = new Properties();
  
//  BufferedReader bufr = new BufferedReader(new FileReader(configFile));
  FileReader fr = new FileReader(configFile);
  
  
  prop.load(fr);
  
  
  for(int x=1; x<=prop.size(); x++){
   
   String className = prop.getProperty("usb"+x);
   //获取指定类的字节码文件对象。
   Class clazz = Class.forName(className);
   //创建该类的实例。
   USB usb = (USB)clazz.newInstance();
   
   book.useUSB(usb);
   
  }
  
  
  fr.close();

 package org.bean.reflact.tall;public class NoteBook { public void useUSB(USB usb) {  if(usb!=null)  {   usb.close();   usb.start();  } }}
package org.bean.reflact.tall;public interface USB { public void start(); public void close();}
package org.bean.reflact.tall;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Properties;public class Test { public static void main(String[] args) {  NoteBook book=new NoteBook();  File file=new File("temp\\usb.properties");  try {   FileReader fread=new FileReader(file);   Properties properties=new Properties();   try {    properties.load(fread);    for(int i=1;i<=properties.size();i++)    {     String value=properties.getProperty("usb"+i);     try {      Class clazz=Class.forName(value);      //初始化对象实例      try {       USB usb=(USB)clazz.newInstance();       book.useUSB(usb);      } catch (InstantiationException        | IllegalAccessException e) {       // TODO Auto-generated catch block       e.printStackTrace();      }     } catch (ClassNotFoundException e) {      // TODO Auto-generated catch block      e.printStackTrace();     }    }   } catch (IOException e) {    // TODO Auto-generated catch block    e.printStackTrace();   }  } catch (FileNotFoundException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }   }}

//实体类

 Mouse,KeyBoard,Camera

//配置文件

usb.properties

<

usb1=org.bean.reflact.tall.KeyBoard

usb2=org.bean.reflact.tall.Mouse
usb3=org.bean.reflact.tall.Camager

>

//输出结果

我是键盘关闭

我是见哦按开启
我是鼠标关闭
我是鼠标开启

转载于:https://my.oschina.net/LiuLangEr/blog/352042

你可能感兴趣的文章
PHP-Phalcon框架中的数据库操作
查看>>
第16届电源技术专题研讨会
查看>>
Python web前端 05 JavaScript
查看>>
Hibernate(1) 阻抗不匹配
查看>>
如何才能留住员工
查看>>
Pascal常用函数
查看>>
LeetCode - 12. Integer to Roman
查看>>
Python——hashlib
查看>>
关于DB2 ORACLE MYSQL 数据库 where字句执行顺序问题
查看>>
Java+Selenium3.3.1环境搭建
查看>>
@responseBody注解的使用
查看>>
为什么in_array(0, ['a', 'b', 'c'])返回true
查看>>
CISCO 7204路由器SDH线路配置
查看>>
判断手机端还是pc端
查看>>
如何在MySQL中设置外键约束
查看>>
Squares 四边形数量,求坐标很重要
查看>>
Luence简单实现2
查看>>
instruction set汇总
查看>>
借助语义技术构建 Wikipedia 查询表单
查看>>
12.5日个人工作总结
查看>>