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

     

  • 相关阅读:
    方维P2P  二次开发
    Array 数组去重 总结10方法(7)
    PHP  OOP学习总结
    [转载]js:数组里面获取键名和键值
    Array对象的方法实现(6)----Array.prototype.indexOf(实现常规参数的功能)
    在Apache服务器上启用GZip压缩静态内容的方法
    PHP 程序授权验证开发思路
    【转】zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
    公钥私钥,HTTPS,CA证书机构,单向和双向认证
    Array对象的方法实现(5)----Array.prototype.includes(实现常规参数的功能)
  • 原文地址:https://www.cnblogs.com/heroinss/p/10330376.html
Copyright © 2011-2022 走看看