• 静态代理和动态代理笔记


    总体分为:

    1.静态代理:

            代理类和被代理类需要实现同一个接口.在代理类中初始化被代理类对象.在代理类的方法中调          用被代理类的方法.可以选择性的在该方法执行前后增加功能或者控制访问

    2.动态代理:

            在程序执行过程中,实用JDK的反射机制,创建代理对象,并动态的指定要代理的对象,动态代理          不需要创建代理类

            动态代理是一种创建java对象的能力

    java中,想要创建对象:

    1.通过构造方法new对象

    2.克隆

    3.反射

    4.反序列化

           2.1.JDK动态代理:  JDK代理是基于接口的代理,要求目标对象实现至少一个接口。JDK 动态         代理是 Java 标准库提供的一种代理机制,它基于接口生成代理对象。JDK 动态代理使用               java.lang.reflect.Proxy 类和 InvocationHandler 接口来创建代理对象,并要求目标对象            必须实现至少一个接口。这种代理机制适用于接口代理,通常用于 AOP 等场景。

            JDK代理不会生成.class字节码文件.但会在内存中生成

           2.2.CGLIB动态代理: MethodInterceptor 是CGLIB代理机制中的一部分,通常与CGLIB代理           一起使用。CGLIB 动态代理是一个独立的字节码生成库,它通过生成目标对象的子类来创建           代理对象,不要求目标对象实现接口。CGLIB 动态代理可以代理普通的类,而不仅仅是实现           了接口的类。这种代理机制适用于类代理,通常用于 ORM 框架Spring 中的@Transactional           等场景。

            CGLIB会生成.class字节码文件

            记住上面两种,下面具体概念,在慢慢学习中了解

            2.3.javassist动态代理:Javassist 是另一个字节码操作库,它可以用于生成动态代理类。                Javassist 动态代理与 CGLIB 相似,可以代理普通类,但它的使用方式和实现略有不同。

            它不是 Java 标准库中的动态代理实现的一种

            2.4.Byte Buddy动态代理:Byte Buddy 是一个现代的字节码生成库,也可以用于创建动态代          理对象。Byte Buddy 提供了更直观和强大的 API,可以用于生成代理类。

    使用代理模式的作用:

            1.功能增强:在原有功能前后额外增加功能

            2.访问控制:例如设置条件,条件允许才可以访问

    1.静态代理:静态代理的实现中,代理类和被代理类必须实现同一个接口,而且代理类需要自己手工实现且你所要代理的目标类是确定的

            实现简单,容易理解

    新建项目

    设置下maven与encoding

    新建moudle  

    先学习下Method调用invoke()

    举例  

    方法前后都加了日志,但对于HelloSpeaker类来说,打日志并非业务逻辑,会增加额外负担

    程序中如果这种日志到处需要使用.程序员不得不到处写日志动作.

    有没有办法,让程序员修改简单代码,就可以选择性的打日志

    定义一个接口HelloSpeaker1好比原来的HelloSpeaker

    现在写个静态代理类,这么去做

    测试结果  和原来一摸一样

    那么我需要打日志的话,就只需要修改一下new HelloProxy(new HelloSpeaker1);

    不需要打日志我就new HelloSpeaker();

    换种写法

    有时候要学会多变一点

    比如在代理类HelloProxy中

    定义成员变量时候直接new了

    那最后就两种

    new HelloProxy();

    或者new HelloSpeaker();

    代理类为被代理的类增强了功能且可以做访问控制

    这就是静态代理

    静态代理要求:代理类和被代理的类必须实现同一个接口.

                            缺点:目标类多了,代理类可能也要成倍增加,且接口中的功能增加会影响目标类和

    下面看下动态代理

    JDK动态代理:  需要目标类实现某个接口

    Proxy.newProxyInstance(目标类的ClassLoad,目标类实现的接口数组,处理对象)      创建代理对象

    第一个参数:ClassLoad的获得:通过目标对象.getClass.getClassLoader()

    或者目标类.class.getClassLoader() 或者目标接口.class.getClassLoader()

    反正就是个ClassLoader对象

    第二个参数是:Class[ ] clazzs   接口数组类对象

    第三个参数是:处理器本身对象

    匿名写法

    JDK动态代理不会生成.class字节码文件(内存中生成)

    CGLIB动态代理会生成.class字节码文件

    CGLIB代理:CGLIB是第三方工具库,动态创建代理对象

    CGLIB原理是继承,通过继承目标类(即被代理类),动态创建它的子类

    在子类中重写父类(目标类的)同名方法,实现功能修改(那么目标类不能是final的,方法也不能是final的)

    举例

    最后看下JDK代理和CGLIB代理的对象引用长什么样子.............

    JDK的样子

    CGLIB的样子

    在不改变原有代码,进行功能增强或者访问控制

  • 相关阅读:
    推荐几本这个系列封面的编程书,涉及Python、计算机图形学、Linux
    第四十六章 开发自定义标签 - 标签匹配 操作中的运行时表达式
    NJUPT算法分析与设计期末考试2021.11.24
    读书笔记:Effective C++ 2.0 版,条款28(namespace )
    ConsulManager安装
    写在Go语言招生之际
    【UCIe】UCIe Runtime Link Test Using Parity
    k8s网络模型介绍:pod内/间通信
    Android开发APP显示头部Bar
    EPIT定时器实验
  • 原文地址:https://blog.csdn.net/tiantiantbtb/article/details/132805136