黑马程序员技术交流社区
标题:
动态代理好难,求指点
[打印本页]
作者:
邝雄伟
时间:
2013-2-1 01:52
标题:
动态代理好难,求指点
在动态代理技术中Proxy和InvocationHandler都起到了什么作用?配置文件又是如何作用到动态代理技术中的呢?
Proxy又是如何与需要被代理的内容联系起来的呢?
谁能把动态代理技术的运行流程介绍一下?
作者:
廖成
时间:
2013-2-1 11:49
动态代理相比前一篇文章所实现的静态代理,动态代理具有更强的灵活性,因为它不用在我们设计实现的时候就指定某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运行时由JVM
来实现
。
我们知道,所谓代理,就是需要代理类和被代理类有相同的对外接口或者说成服务,所以代理类一般都必须实现了所有被代理类已实现的接口,因为接口就是制定了一系列对外服务的标准。
正因为动态代理有这样灵活的特性,所以我们在设计动态代理类时不用显式地让它实现与真实主题类相同的接口,而是把这种实现推迟到运行时。
为了能让DynamicProxy
类能够在运行时才去实现
RealSubject
类已实现的一系列接口并执行接口中相关的方法操作,需要让
DynamicProxy
类实现
JDK
自带的
j
ava.lang.reflect.InvocationHandler
接口,该接口中的
invoke()
方法能够让
DynamicProxy
实例在运行时调用被代理类的“对外服务”,即调用被代理类需要对外实现的所有接口中的方法,也就是完成对真实方法的调用,
Java
帮助文档中称这些真实方法为处理程序。
按照上面所述,我们肯定必须先把被代理类
RealSubject
已实现的所有
interface
都加载到
JVM
中,不然
JVM
怎么能够找到这些方法呢?明白了这个道理,那么我们就可以创建一个被代理类的实例,获得该实例的类加载器
ClassLoader
。
所谓的类加载器
ClassLoader
,就是具有某个类的类定义,即类的内部相关结构(包括继承树、方法区等等)。
更重要的是,动态代理模式可以使得我们在
不改变原来已有的代码结构
的情况下,对原来的“真实方法”进行
扩展、增强其功能
,并且可以
达到控制被代理对象的行为的目的
。请详看下面代码中的DynamicProxy类,其中必须实现的invoke()方法在调用被代理类的真实方法的前后都可进行一定的特殊操作。这是动态代理最明显的优点。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2