zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    (最短路)2017 计蒜之道 复赛 D. 百度地图导航
    13 树的应用-并查集
    12 二叉树-链式存储-二叉排序树(BST)
    11 二叉树-链式存储-先序遍历、中序遍历、后序遍历和层序遍历的非递归算法实现
    10 二叉树-链式存储-递归遍历
    9 线性表-队列-链式存储
    8 线性表-循环队列-顺序存储
    操作系统-页式虚拟存储器管理系统设计
    杂谈:Windows操作系统的介绍与对Win8操作系统市场反响冷淡原因的分析
    一学期积累下来的SQL语句写法的学习
  • 原文地址:https://www.cnblogs.com/heapStark/p/8143291.html
Copyright © 2011-2022 走看看