根据上面提到的java的内建代理模式,要实现一个InvocationHandler,下面这段代码展示了MyInvocationHandler 的主要部分:
private class MyInvocationHandler implements InvocationHandler { String backendClassName;//实际的类名Object backend;//实际的类对象public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /** * 在第一载入的时候通过loadClass来载入所需要的服务实现对象,后边每次检查java文件是否被修改过,* 如果被修改就unload当前的对象,编译并重新载入该类。
*/ Class clz = loadClass(backendClassName);if (backend.getClass() != clz) { backend = newDynaCodeInstance(clz);
}
// 调用有效的对象的方法return method.invoke(backend, args);}在MyInvocationHandler中保存了实现接口的类名和该类的一个对象,该对象也就是通过newDynaCodeInstance()方法得到的对象。在每一次调用该对象的方法的时候,java的Proxy机制保证了系统会自动调用MyInvocationHandler的invoke方法。
这里采用反射进行动态载入的程序,调用的实际工作是在InvocationHandler的invoke方法中做的,因此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次浏览)



