JDK动态代理
优点:
相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象。
下面是代理模式详解:https://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
使用代理模式必须要让代理类和目标类实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理(如在调用目标方法前校验权限,在调用完目标方法后打印日志等)等功能。
实现:
1.通过实现InvocationHandler接口来自定义自己的InvocationHandler;
优缺点对比,以及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动态代理机制
AOP的底层实现-CGLIB动态代理和JDK动态代理
http://blog.csdn.net/jiankunking/article/details/52143504