JDK动态代理

优点:

  相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。

下面是代理模式详解:https://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html

  使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能。

实现:

1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;

 
2.通过Proxy.getProxyClass获得动态代理类
 
3.通过反射机制获得代理类的构造方法,方法签名为getConstructor(InvocationHandler.class)
 
4.通过构造函数获得代理对象并将自定义的InvocationHandler实例对象传为参数传入
 (步骤2,3,4)可以通过 直接使用Proxy.newProxyInstance()替换
5.通过代理对象调用目标方法
 

优缺点对比,以及lamdba表达式:

JDK:

jdk动态代理原理:jdk动态代理是由java内部的反射机制来实现的,反射机制在生成类的过程中比较高效。

缺点:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用

 

CGLIB:

CGLIB原理:cglib动态代理底层则是借助asm(一个 Java 字节码操控框架)来实现的,动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。它比使用java反射的JDK动态代理要快。

CGLIB底层:使用字节码处理框架ASM,来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。

CGLIB缺点:对于final方法,无法进行代理。

lamdba表达式在某种角度上可以替换动态代理的实现。

 
 

参考:

深度剖析JDK动态代理机制

CGLIB介绍与原理

 

AOP的底层实现-CGLIB动态代理和JDK动态代理

http://blog.csdn.net/jiankunking/article/details/52143504

posted @ 2017-12-29 10:43  heapStark  阅读(113)  评论(0编辑  收藏  举报