核心机制:继承与方法拦截
- 动态生成子类: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文件