快速业务通道

Java动态代理机制分析及扩展,第1部分 - 编程入门网

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

Java动态代理机制分析及扩展,第1部分

时间:2011-06-21 IBM / 王忠平 何平

引言

Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要 简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所 有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可 以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。通过阅 读本文,读者将会对 Java 动态代理机制有更加深入的理解。本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内 部实现。

代理:设计模式

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对 某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及 进行消息被委托类执行后的后续处理。

图 1. 代理模式

为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访 问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对 象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策 略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙 的方式近乎完美地实践了代理模式的设计理念。

相关的类和接口

要了解 Java 动态代理的机制,首先需要了解以下相关的类或接口:

java.lang.reflect.Proxy:这是 Java 动态代理机制的主类,它提供了一组 静态方法来为一组接口动态地生成代理类及其对象。

清单 1. Proxy 的静态 方法

// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器 static InvocationHandler getInvocationHandler(Object proxy) // 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类 的类对象 static Class getProxyClass(ClassLoader loader, Class[]  interfaces) // 方法 3:该方法用于判断指定类对象是否是一个动态代理类 static boolean isProxyClass(Class cl) // 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态 代理类实例 static Object newProxyInstance(ClassLoader loader, Class[]  interfaces,    InvocationHandler h)

Java动态代理机制分析及扩展,第1部分(2)

时间:2011-06-21 IBM / 王忠平 何平

java.lang.reflect.InvocationHandler:这是调用处理器接口,它自定义了 一个 invoke 方法,用于集中处理在动态代理类对象上的方法调用,通常在该方 法中实现对委托类的代理访问。

清单 2. InvocationHandler 的核心方法

// 该方法负责集中处理动态代理类上的所有方法调用。第一个参数 既是代理类实例,第二个参数是被调用的方法对象 // 第三个方法是调用参数。调用处理器根据这三个参数进行预处理或分派到 委托类实例上发射执行 Object invoke(Object proxy, Method method, Object[] args)

每次生成动态代理类对象时都需要指定一个实现了该接口的调用处理器对象 (参见 Proxy 静态方法 4 的第三个参数)。

java.lang.ClassLoader:这是类装载器类,负责将类的字节码装载到 Java 虚拟机(JVM)中并为其定义类对象,然后该类才能被使用。Proxy 静态方法生 成动态代理类同样需要通过类装载器来进行装载才能使用,它与普通类的唯一区 别就是其字节码是由 JVM 在运行时动态生成的而非预存在于任何一个 .class 文件中。

每次生成动态代理类对象时都需要指定一个类装载器对象(参见 Proxy 静态 方法 4 的第一个参数)

代理机制及其特点

首先让我们来了解一下如何使用 Java 动态代理。具体有如下四步骤:

通过实现 InvocationHandler 接口创建自己的调用处理器;

通过为 P

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号