a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 126|回复: 0

[专业语言] Java认证辅导:关于用动态代理进行修饰(1)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
动态代办代庖工具 是 java.lang.reflect 包的一部门,在 JDK 1.3 版本中添加到 JDK,它许可轨范建树代办代庖对象,代办代庖对象能实现一个或多个已知接口,并用反射庖代内置的虚体例分拨,编程地分拨对接口体例的挪用。这个过程许可实现“进取”体例挪用,从头路由它们或者动态地添加功能。
/ ~% j6 `; q0 L动态代办代庖为实现良多常见设计模式(搜罗 Facade、Bridge、Interceptor、Decorator、Proxy(搜罗远程和虚拟代办代庖)和 Adapter 模式)供给了替代的动态机制。虽然这些模式不使用动态代办代庖,只用通俗的类就能够实现,可是在良多情形下,动态代办代庖体例更便利、更紧凑,可以断根良多手写或生成的类。% J  M6 [" ~7 b2 n0 o* F
Proxy模式/ r% r! p) A7 Q4 S" d
Proxy 模式中要建树“stub”或“surrogate”对象,它们的目的是接管请求并把请求转发到现实执行工作的其他对象。远程体例挪用(RMI)操作 Proxy 模式,使得在其他 JVM 中执行的对象就像当地对象一样;企业 JavaBeans (EJB)操作 Proxy 模式添加远程挪用、平安性和事务分界;而 JAX-RPC Web 处事则用 Proxy 模式让远程处事默示得像当地对象一样。在每一种情形中,潜在的远程对象的行为是由接口界说的,而接口素质上接管多种实现。挪用者(在大大都情形下)不能区扶持它们只是持有一个对 stub 而不是现实对象的引用,因为二者实现了不异的接口;stub 的工作是查找现实的对象、封送参数、把参数发送给现实对象、解除仿胪返回值、把返回值返回给挪用者。代办代庖可以用来供给远程节制(就像在 RMI、EJB 和 JAX-RPC 中那样),用平安性策略包装对象(EJB)、为昂贵的对象(EJB 实体 Bean)供给惰性装入,或者添加检测工具(例如日志记实)。9 \7 K5 J% m# h* l5 r& G
在 5.0 以前的 JDK 中,RMI stub(以及它对等的 skeleton)是在编译时由 RMI 编译器(rmic)生成的类,RMI 编译器是 JDK 工具集的一部门。对于每个远程接口,城市生成一个 stub(代办代庖)类,它代表远程对象,还生成一个 skeleton 对象,它在远程 JVM 中做与 stub 相反的工作 —— 解除封送参数并挪用现实的对象。近似地,用于 Web 处事的 JAX-RPC 工具也为远程 Web 处事生成代办代庖类,从而使远程 Web 处事看起来就像当地对象一样。0 Z" E- P( w& J
不管 stub 类是以源代码仍是以字节码生成的,代码生成仍然会向编译过程添加一些额外轨范,而且因为命名相似的类的泛滥,会带来意义恍惚的可能性。另一方面,动态代办代庖机制撑持在编译时没有生成 stub 类的情形下,在运行时建树代办代庖对象。在 JDK 5.0 及往后版本中,RMI 工具使用动态代办代庖庖代了生成的 stub,结不美观 RMI 变得更轻易使用。良多 J2EE 容器也使用动态代办代糊弄实现 EJB。EJB 手艺严重地依靠使用阻挡(interception)来实现平安性和事务分界;冻┈代办代庖为接口上挪用的所有体例供给了集中的节制流程路径。
, D5 D9 I1 c& ^( C" W3 x动态代办代庖机制
& d* k9 r/ Q6 Y! b, e" P动态代办代庖机制的焦点是 InvocationHandler 接口,如清单 1 所示。挪用句柄的工作是代表动态代办代庖现实执行所请求的体例挪用。传递给挪用句柄一个 Method 对象(从 java.lang.reflect 包),参数列表则传递给体例;在最简单的情形下,可能仅仅是挪用反射性的体例 Method.invoke() 并返回结不美观。8 {( K- Z8 @9 K( F' j0 _
清单 1. InvocationHandler 接口
( A# g5 z& y3 i  `2 {public interface InvocationHandler { Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
5 D2 Z- w- V, u8 s* c9 k" ~: i每个代办代庖都有一个与之联系关系的挪用句柄,只要代办代庖的体例被挪用时就会挪用该句柄。按照通用的设计原则:接口界说类型、类界说实现,代办代庖对象可以实现一个或多个接口,可是不能实现类。因为代办代庖类没有可以访谒的名称,它们不能有机关函数,所以它们必需由工场建树。清单 2 显示了动态代办代庖的最简单的可能实现,它实现 Set 接口并把所有 Set 体例(以及所有 Object 体例)分拨给封装的 Set 实例。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 23:03 , Processed in 0.183484 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表