|
public class PostmanImpl implements Postman { private PrintStream output; public void deliverMessage(String msg) { |
在程序运行中,我们就是要通过动态修改PostmanImpl 来观察这个JSP一样的现象。
3,访问服务
这里要介绍一些访问服务的main程序,以便看到这种方式的优越性。
| public class PostmanApp { public static void main(String[] args) throws Exception { BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in)); Postman postman = getPostman(); while (true) { System.out.print("Enter a message: "); String msg = sysin.readLine(); postman.deliverMessage(msg); } } private static Postman getPostman() { DynaCode dynacode = new DynaCode(); dynacode.addSourceDir(new File("dynacode")); return (Postman) dynacode.newProxyInstance(Postman.class, "sample.PostmanImpl"); } } |
我们可以看到获取PostMan对象,只是在初始化的过程中做过一次,后边只是访问其deliverMessage()方法, 而 sample.PostmanImpl这一实现的动态改变完全被掩藏在这个小小框架的后边。Java文件改变后的编译、重新载入、对象实例化和方法的调用过程完全不可见,是不是很神奇的实现。
4,DynaCode
看了这样的主程序,你可能会首先看一下DynaCode的实现,然而我不准备详细讲述DynaCode的实现,尽管它的实现最为复杂。因为 DynaCode只是简单的包装了java.lang.reflect.Proxy,通过添加几个处理class路径和java路径的方法辅助来完成工作的,我不想重点介绍java反射机制的,因此我们只来看DynaCode一个重要的方法。
| public Object newProxyInstance(Class interfaceClass, String implClassName) throws RuntimeException { MyInvocationHandler handler = new MyInvocationHandler( implClassName); return Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class[] { interfaceClass }, handler); } |
好了,看到了吧,DynaCode只是在内部做了一个InvocationHandler实现,并简单的使用了Proxy的newProxyInstance()方法。
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- Java环境安装配置 (5713篇文章)
- Java编程开发手册 (8376篇文章)
- Java的类 (877篇文章)
- Java基础开发篇 (592篇文章)
- Java与其他集成开发篇 (185篇文章)
- 在Eclipse中配置Struts2项目 (130次浏览)
- 在Spring中使用JTA事务管理 (116次浏览)
- 史上最简单的struts+spring+hibernate配置实 (101次浏览)
- 玩玩Spring之struts+hibernate+spring添删改 (82次浏览)
- 使用Spring MVC表单标签 (77次浏览)
- 详细讲解在Spring中进行集成测试 (72次浏览)
- 在Spring中使用Quartz进行任务调度 (70次浏览)
- 专家视点:Java能够替代C语言吗? (53次浏览)
- 使用Acegi进行身份认证(之一) (52次浏览)
- 使用myeclipse集成struts,hibernate,spring的 (50次浏览)



