代理的原理: 我有一个程序: public class X{public void sayHello(){ syso:say hello; } startTime:} 现在我要在这个方法之前添加一个时间,方法之后添加一个时间,计算这个方法执行的时间一共是多少.如果我没有得到sayHello源码,那么我怎么做呢?写一个代理: public class XProxy{ x.syHello(); endTime; } } 把开始时间和结束时间放在这个方法的前后就可以了. 通常我们让两个方法实现同一个接口.那么client想用X也可以,想用XProxy也可以了.具体的原理图,如下图所示: 下面讲解一下AOP,面向方面编程: 只要是面向方面的编程,就要涉及到代理 如果要为系统中的各种借口增加代理类,那将需要很多的代理类。可能需要成百上千个,这样的话是不是太累了呀。那有没有好的办法呢? 有。java虚拟机可以在运行期间动态生成类,这种类是以字节码的形式生成出来的。这种动态生成的类往往呢就是代理类。即动态代理类。(一会我们将实现JVM动态生成类的过程。) JVM生成的动态代理类必须满足一定的条件,这就是必须实现一个或多个接口。所以JVM生成的动态代理只能用作具有相同接口的目标类的代理。(动态生成的类不是代理,我们只是吧这个类当成代理来用。) Proxy动态代理的API: 下面我们来动手操作一下,动态创建一个代理类.大体的思路如下: 我们来查看一下API 下面来分析一下代理的原理: 下面在来看一个问题: 动态代理的工作原理图: 我们来做最后一步,将上面的动态生成的代理类,编写可生成代理和插入通告的通用方法 重构以后的代理方法 |
|
来自: I_T_馆 > 《张孝祥java高新技术》