利用反射实现类的动态加载

 
首先定义一个接口来隔离
package org.bromon.reflect;
public interface Operator
{
public java.util.List act(java.util.List params)
}
根据设计模式的原理,我们可以为不同的功能编写不同的,每个都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很多麻烦。比如这个
package org.bromon.reflect.*;
public class Success implements Operator
{
public java.util.List act(java.util.List params)
{
List result=new ArrayList();
result.add(new String( “操作成功”));
return result;
}
}
我们还可以写其他很多,但是有个问题,接口是无法实例化的,我们必须手动控制具体实例化哪个,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实例化一个,执行它的act方法,那我们的工作就轻松多了。
很幸运,我使用的是Java,只有Java才提供这样的反射机制,或者说内省机制,可以实现我们的无理要求。编写一个配置文件emp.properties:
# 成功响应
1000=Success
# 向客户发送普通文本消息
2000=Load
3000=Store
下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个
package org.bromon.reflect.*;
import java.lang.reflect.*;
public class TestReflect
{
private String loadProtocal(String header)
{
String result=null;
try
{
Properties prop=new Properties();
FileInputStream fis=new FileInputStream("emp.properties");
prop.load(fis);
result=prop.getProperty(header);
fis.close();
}catch(Exception e)
{
System.out.println(e);
}
return result;
}
// 针对消息作出响应,利用反射导入对应的
public String response(String header,String content)
{
String result=null;
String s=null;
try
{
/*
* 导入属性文件查询header所对应的的名字emp.properties,
* 通过反射机制动态加载匹配的,所有的都被Operator接口隔离
*/
s="org.bromon.reflect."+this.loadProtocal(header);
// 加载
Class c=Class.forName(s);
// 创建的事例
Operator mo=(Operator)c.newInstance();
// 构造参数列表
Class params[]=new Class[1];
params[0]=Class.forName("java.util.List");
// 查询act方法
Method m=c.getMethod("act",params);
Object args[]=new Object[1];
args[0]=content;
// 调用方法并且获得返回
Object returnObject=m.invoke(mo,args);
}catch(Exception e)
{
System.out.println("Handler-response:"+e);
}
return result;
}
public static void main(String args[])
{
TestReflect tr=new TestReflect();
tr.response(args[0], ”消息内容”);
}
}
测试一下:java TestReflect 1000
这个程序是针对Operator编程的,所以无需做任何修改,直接提供Load和Store,就可以支持2000、3000做参数的调用。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值