分享

分析代理类的作用与原理及AOP概念

 I_T_馆 2014-08-04


代理的原理:
我有一个程序:
public class X{
public void sayHello(){
syso:say hello;
}
}
现在我要在这个方法之前添加一个时间,方法之后添加一个时间,计算这个方法执行的时间一共是多少.如果我没有得到sayHello源码,那么我怎么做呢?写一个代理:
public class XProxy{
startTime:
x.syHello();
endTime;
}
}
把开始时间和结束时间放在这个方法的前后就可以了.
通常我们让两个方法实现同一个接口.那么client想用X也可以,想用XProxy也可以了.具体的原理图,如下图所示:
 
 
下面讲解一下AOP,面向方面编程:
 
 
只要是面向方面的编程,就要涉及到代理

如果要为系统中的各种借口增加代理类,那将需要很多的代理类。可能需要成百上千个,这样的话是不是太累了呀。那有没有好的办法呢?

有。java虚拟机可以在运行期间动态生成类,这种类是以字节码的形式生成出来的。这种动态生成的类往往呢就是代理类。即动态代理类。(一会我们将实现JVM动态生成类的过程。)

JVM生成的动态代理类必须满足一定的条件,这就是必须实现一个或多个接口。所以JVM生成的动态代理只能用作具有相同接口的目标类的代理。(动态生成的类不是代理,我们只是吧这个类当成代理来用。)

 
 Proxy动态代理的API:
 
 
下面我们来动手操作一下,动态创建一个代理类.大体的思路如下:
 
 


 
接下来我们来创建这个动态代理类的实例。那么直接clazzProxy1.newInstance();可不可以呢?显然是不可以的嘛.我们刚刚说了,动态生成的这个代理类只有一个构造方法,有没有无参构造方法呢?没有啊.所以,创建 一个参数的构造方法.参数类型是java.lang.reflect.InvocationHandler。
我们来查看一下API 
  
 
  
  
 
   
 
  
   
下面来分析一下代理的原理:

 
 
 下面在来看一个问题:
 
动态代理的工作原理图:
 
 
对上面的这个图,我们简单来说说:客户端动态生成代理类,然后调用代理类的方法,代理类内部调用handler.invoke()方法,在invoke中呢,我们又指向的目标类.这样就实现了代理了.我客户端调用代理的什么方法,invoke就只向目标类的同一个方法.而在指定目标类方法的前后呢,我们还可以做其他的操作,比如记录日志.图中用圈圈出来的部分就是代理类自己实现的功能了.这就是代理类的原理.

 
 


我们来做最后一步,将上面的动态生成的代理类,编写可生成代理和插入通告的通用方法
 
 
重构以后的代理方法
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多