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

  • 相关阅读:
    Hadoop生态圈-Hive快速入门篇之HQL的基础语法
    Hadoop生态圈-Hive快速入门篇之Hive环境搭建
    Hadoop生态圈-zookeeper的API用法详解
    Hadoop生态圈-zookeeper完全分布式部署
    Hadoop基础-MapReduce的工作原理第一弹
    Hadoop基础-HDFS的读取与写入过程
    java基础-回调函数(callback)
    Hadoop基础-网络拓扑机架感知及其实现
    Hadoop基础-HDFS数据清理过程之校验过程代码分析
    Hadoop基础-Protocol Buffers串行化与反串行化
  • 原文地址:https://www.cnblogs.com/heapStark/p/8143291.html
Copyright © 2011-2022 走看看