快速业务通道

Java中利用反射实现类的动态加载 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

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

时间:2011-02-14

//首先定义一个接口来隔离类: public interface Operator { //  public java.util.List act(java.util.List params); public java.util.List act(String content,String content2,java.util.List params); }

根据设计模式的原理,我们可以为不同的功能编写不同的类,每个类都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很多麻烦。比如这个类:

import java.util.*; public class Success implements Operator { public static void main(String[] args) { List list = new ArrayList(); list.add("Success3"); Operator op = new Success(); System.out.println("act===" + op.act("Success1", "Success2", list)); } //    public java.util.List act(java.util.List params) public java.util.List act(String content, String content2, java.util.List params) { List result = new ArrayList(); result.add(content); result.add(content2); result.add(params); return result; } }

同样,也可以写另一个类:

import java.util.*; public class Load implements Operator { public static void main(String[] args) { List list = new ArrayList(); list.add("Load3"); Operator op = new Load(); System.out.println("act===" + op.act("Load1", "Load2", list)); } //    public java.util.List act(java.util.List params) public java.util.List act(String content, String content2, java.util.List params) { List result = new ArrayList(); result.add(content); result.add(content2); result.add(params); return result; } }

我们还可以写其他很多类,但是有个问题,接口是无法实例化的,我们必须手动控制具体实例化哪个类,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实例化一个类,执行它的act方法,那我们的工作就轻松多了。

很幸运,我使用的是Java,只有Java才提供这样的反射机制,或者说内省机制,可以实现我们的无理要求。编写一个配置文件emp.properties:

#成功响应

1000=Success

#向客户发送普通文本消息

2000=Load

#客户向服务器发送普通文本消息

3000=Store

Java中利用反射实现类的动态加载(2)

时间:2011-02-14

文件中的键名是客户将发给我的消息头,客户发送1000给我,那么,我就执行Success类的act方法,类似的如果发送2000给我,那就执行Load类的act方法,这样一来系统就完全符合开闭原则了,如果要添加新的功能,完全不需要修改已有代码,只需要在配置文件中添加对应规则,然后编写新的类,实现act方法就ok,即使我弃这个项目而去,它将来也可以很好的扩展。这样的系统具备了非常良好的扩展性和可插入性。

下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个类:

import java.lang.reflect.*; import java.util.Properties; import java.io.FileInputStream; import java.util.List; //这个程序是针对Operator编程的,所以无需做任何修改,直接提供Load和Store类, 就可以支持2000、3000做参数的调用 //有了这样的内省机制,可以把接口的作用发挥到极至,设计模式也更能体现出威力, 而不仅仅供我们饭后闲聊。 public class TestReflect { //加载配置文件,查询消息头对应的类名 private String loadProtocal(String header) { String result=null; try { Properties prop=new Properties(); //      FileInputStream fis=new FileInputStream(&quo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号