cglib动态代理

核心机制:继承与方法拦截

  • 动态生成子类:CGLIB 通过 ASM(Java 字节码操作库) 直接生成目标类的子类字节码,并重写目标方法。
  • 方法拦截器:使用MethodInterceptor接口拦截所有代理方法的调用,类似于 JDK 动态代理的InvocationHandler,但功能更强大
package com.example;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

// 目标类(没有实现任何接口)
class TargetClass {
    public String sayHello(String name) {
        return "Hello, " + name + "!";
    }
}

// 方法拦截器实现
class CustomMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        // 方法调用前的处理
        System.out.println("Before method call: " + method.getName());
        
        // 调用原始方法
        Object result = proxy.invokeSuper(obj, args);
        
        // 方法调用后的处理
        System.out.println("After method call: " + method.getName());
        
        return result;
    }
}

// 主类
public class CglibProxyExample {
    public static void main(String[] args) {
        // 创建 Enhancer 实例
        Enhancer enhancer = new Enhancer();
        
        // 设置要代理的目标类
        enhancer.setSuperclass(TargetClass.class);
        
        // 设置回调(拦截器)
        enhancer.setCallback(new CustomMethodInterceptor());
        
        // 创建代理对象
        TargetClass proxy = (TargetClass) enhancer.create();
        
        // 调用代理对象的方法
        String result = proxy.sayHello("World");
        System.out.println("Result: " + result);
    }
}    

重点

cglib是通过ASM框架操作字节码从而生成了代理类。但是它的字节码只存在于内存中,不会创建class文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。