• CGLIB 动态代理使用


    一、CGLIB

    Cglib是一个强大的,高性能,高质量的代码生成类库。它可以在运行期扩展JAVA类与实现JAVA接口。其底层实现是通过ASM字节码处理框架来转换字节码并生成新的类。大部分功能实际上是ASM所提供的,Cglib只是封装了ASM,简化了ASM操作,实现了运行期生成新的class。

    运行时动态的生成一个被代理类的子类(通过ASM字节码处理框架实现),子类重写了被代理类中所有非 final 的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势植入横切逻辑。

    Cglib优缺点:

    优点:JDK动态代理要求被代理的类必须实现接口,当需要代理的类没有实现接口时Cglib代理是一个很好的选择。实现扩展功能,对我们方法实现增强、安全性、冗余性提高代码复用机制。

    缺点:对于被代理类中的final方法,无法进行代理,因为子类中无法重写final函数

    注意:jdk7 开始 jdk 动态代理效率比 cglib 要高。

    二、CGLIB代理实现

    实现 MethodInterceptor 接口的 intercept 方法后,所有生成的代理方法都调用这个方法。
    intercept方法的具体参数有

    1. obj 目标类的实例
    2. method 目标方法实例(通过反射获取的目标方法实例)
    3. args 目标方法的参数
    4. proxy 代理类的实例
      该方法的返回值就是目标方法的返回值。
    @Slf4j
    public class CglibMethodInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            log.info("<目标方法之前开始执行....>");
            Object result = proxy.invokeSuper(obj, args);
            log.info("<目标方法之后开始执行....>");
            return result;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    创建目标代理对象:

    @Slf4j
    public class TargetObject {
        
        public String exec(String param) {
            log.info("", param);
            return "ok";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用 CGLIB 代理目标方法:

    public class Test {
        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(TargetObject.class);
            enhancer.setCallback(new CglibMethodInterceptor());
            TargetObject targetObject = (TargetObject) enhancer.create();
            String result = targetObject.exec("ABC");
            System.out.println(result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

  • 相关阅读:
    lwIP 开发指南(中)
    数据分析:小红书2024年年轻人社交趋势洞察
    数学建模学习(85):人工蜂群优化算法(ABCO)求解多元函数
    《算法基础》基础数据结构
    面试阿里算法岗,艰难走到终面了。。。
    香港Web3.0生态现状
    [100天算法】-最长有效括号(day 38)
    智能照明控制系统助力某商业综合体实现“双碳”
    L1-002 打印沙漏分数 20
    【go-zero】 Goland中的terminal与电脑terminal goctl版本 始终不一致问题
  • 原文地址:https://blog.csdn.net/qq_43692950/article/details/126690354