java反射机制的应用

来源:互联网 发布:中新赛克是大数据公司 编辑:程序博客网 时间:2024/05/21 08:37

package reflect2;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;
/*
 * java反射机制的应用
 *
 */
public class TestReflect {
 /**
  * java提供反射机制
  * 接口无法被实例化,必须手动控制具体实例化某个类
  * 利用java的反射机制,向应用程序传递一个参数,让它自己去选择实例化一个类,执行它的
  * act方法
  * 编写一个配置文件emp.Properties
  *   #成功响应
  * 1000=Success
  *   #向客户发送普通文本信息
  *  2000=Load
  *   #客户向服务器发送普通文本信息
  *  3000=Store
  * 
  *  假如客户发送1000给我的消息头,那么就动态执行Success中的act方法,如果要添加新的
  *  功能,只需在配置文件中添加对应规则,然后编写新的类,实现act方法,这样系统就具备了
  *  良好的可扩展性和可插入性
  * 
  *
  */
 
 //加载配置文件,查询消息头对应的类名
 private String loadProtocal(String header){
  
  String result = null;
  
  try{
   
   Properties pro = new Properties();
   //读取配置文件的信息
   //FileInputStream fis = new FileInputStream("emp.properties");
   InputStream is = TestReflect.class.getResourceAsStream("emp.properties");
   //加载配置文件
   pro.load(is);
   
   result = pro.getProperty(header);
   
   is.close();
   
  }catch(Exception e){
   
  }
  return result;
 }
 //针对消息做出响应,利用反射导入对应的类
 
 public String response(String header,String content){
  
  String result =null;
  
  String s = null;
  
  try{
   /**
    *导入属性文件emp.properties,查询header所对应的类的名字
    *
    * 通过反射机制动态加载匹配的类,所有的类都被Operator接口隔离
    *
    * 可以通过修改属性文件和添加新的类来扩展应用
    *
    */
   //要实例化的具体类的类名
   //具体的包名+要反射的类名
   s = "reflect2."+this.loadProtocal(header);
   
   //加载类
   Class cls = Class.forName(s);
   //创建类的实例
   Operator mo =(Operator)cls.newInstance();
   //构造参数列表
   Class params[] = new Class[1];
   
   params[0] = Class.forName("java.lang.String");
   
   //查询act方法
   Method m = cls.getMethod("act",params);
   //invoke()方法中的第二个参数,act方法中赋值的具体值
   Object args[] = new Object[1];
   
   args[0] = content;
   
   //调用方法并获得返回
   
   //返回的returnObject是字符串类型
   
   Object returnObject = m.invoke(mo, args);
   
   result =(String)returnObject;
   
  }catch(Exception e){
   System.out.println("Hander-response"+e);
  }
  return result;
 }
 public static void main(String[] args){
  TestReflect tr = new TestReflect();
  String s1 =tr.response("1000","消息内容");
  String s2 =tr.response("2000","消息内容");
  System.out.println(s1);
  System.out.println("-------------------------");
  System.out.println(s2);
  
 }
}