• JAVA之代理1JDK


    代理主要有JDK的代理以及CGLIB的代理

    代理方式实现优点缺点特点
    JDK静态代理 代理类与委托类实现同一接口,并且在代理类中需要硬编码接口 实现简单,容易理解 代理类需要硬编码接口,在实际应用中可能会导致重复编码,浪费存储空间并且效率很低 好像没啥特点
    JDK动态代理 代理类与委托类实现同一接口,主要是通过代理类实现InvocationHandler并重写invoke方法来进行动态代理的,在invoke方法中将对方法进行增强处理 不需要硬编码接口,代码复用率高 只能够代理实现了接口的委托类 底层使用反射机制进行方法的调用
    CGLIB动态代理 代理类将委托类作为自己的父类并为其中的非final委托方法创建两个方法,一个是与委托方法签名相同的方法,它在方法中会通过super调用委托方法;另一个是代理类独有的方法。在代理方法中,它会判断是否存在实现了MethodInterceptor接口的对象,若存在则将调用intercept方法对委托方法进行代理 可以在运行时对类或者是接口进行增强操作,且委托类无需实现接口 不能对final类以及final方法进行代理 底层将方法全部存入一个数组中,通过数组索引直接进行方法调用
     
    作者:EakonZhao
    链接:https://www.jianshu.com/p/9a61af393e41
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
     
     
     至此,Cglib动态代理的原理我们就基本搞清楚了,代码细节有兴趣可以再研究下。最后我们总结一下JDK动态代理和Gglib动态代理的区别:
    1.JDK动态代理是实现了被代理对象的接口,Cglib是继承了被代理对象。
    JDK dynamic proxy implements the interface of the proxied object, while Cglib inherits the proxied object.
    2.JDK和Cglib都是在运行期生成字节码,JDK是直接写Class字节码,Cglib使用ASM框架写Class字节码,Cglib代理实现更复杂,生成代理类比JDK效率低。

    Both generate bytecode at runtime。While the JDK writes Class bytecodes directly, Cglib USES the ASM framework to write Class bytecodes。

    The proxy implementation of Cglib is more complex。Generating proxies is inefficient compared to the JDK
     

    3.JDK调用代理方法,是通过反射机制调用,Cglib是通过FastClass机制直接调用方法,Cglib执行效率更高。

     JDK calls proxy methods through reflection mechanism, while Cglib calls methods directly through FastClass mechanism, which makes Cglib execution more efficient.

     

    一篇JDK动态代理机制,主要讲解jdk动态代理源码解读的文章

    https://www.jianshu.com/p/471c80a7e831

     

    还有来自

    某博的一系列博文

    JDK代理:

     

    Java动态代理InvocationHandler和Proxy学习笔记

    https://blog.csdn.net/yaomingyang/article/details/80981004

     

    Java中InvocationHandler接口中第一个参数proxy详解

    https://blog.csdn.net/yaomingyang/article/details/81040390

     

  • 相关阅读:
    codeforces 540 C Ice Cave【BFS】
    UVa 140 Bandwidth【枚举排列】
    UVa 1600 Patrol Robot【BFS】
    UVa 1599 Ideal Path【BFS】
    HDU 4324 Triangle LOVE【拓扑排序】
    HDU 2647 Reward【拓扑排序】
    UVa 10305 Ordering Tasks【拓扑排序】
    codeforces 501 B Misha and Changing Handles 【map】
    codeforces 510 C Fox And Names【拓扑排序】
    落谷_2740/poj_1273/USACO_4.2/网络流
  • 原文地址:https://www.cnblogs.com/heroinss/p/10330376.html
Copyright © 2020-2023  润新知