CGLIB(Code Generation Library)是一个强大的高性能代码生成库,它广泛用于在运行时扩展Java类和实现接口。与JDK动态代理不同,CGLIB不需要接口来创建代理,它可以直接对类进行代理。CGLIB通过继承被代理的类并在子类中覆盖方法来实现代理。
当你使用CGLIB创建代理时,CGLIB会在运行时动态生成一个新的类,这个类是被代理类的子类。对于被代理类中的每个非final的方法,CGLIB生成的代理类将会覆盖这些方法,并在其中插入特定的拦截逻辑。
假设有一个简单的类 MyClass
:
public class MyClass {
public void doSomething() {
System.out.println("Doing something in MyClass.");
}
}
使用CGLIB创建 MyClass
的代理类时,CGLIB会生成一个类似于以下结构的新类(这是一个简化和概念性的表示,实际生成的类名和方法实现细节会有所不同):
public class MyClass$$EnhancerByCGLIB$$<generated> extends MyClass {
private MethodInterceptor interceptor;
public MyClass$$EnhancerByCGLIB$$<generated>(MethodInterceptor interceptor) {
this.interceptor = interceptor;
}
@Override
public void doSomething() {
MethodProxy mp = MethodProxy.create(MyClass.class, this.getClass(), "doSomething", "()V", "doSomething$Super");
interceptor.intercept(this, mp.getMethod(), null, mp);
}
// ... 其他覆盖的方法
}
在这个代理类中,MyClass$$EnhancerByCGLIB$$<generated>
是通过CGLIB生成的类名,<generated>
是一个动态生成的唯一标识符。这个代理类继承自 MyClass
,并且覆盖了 doSomething
方法。在覆盖的 doSomething
方法中,它使用了一个 MethodInterceptor
来拦截方法调用。当 doSomething
方法被调用时,实际上调用的是 MethodInterceptor
的 intercept
方法。
MethodInterceptor
是CGLIB提供的一个接口,它包含一个 intercept
方法,允许用户在方法调用前后添加自定义逻辑:
public interface MethodInterceptor extends Callback {
Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable;
}
创建CGLIB代理实例的过程涉及到配置一个 Enhancer
对象,设置它的回调和需要代理的类,然后调用 create
方法来生成代理对象。这个过程中,CGLIB会使用自己的类加载器来加载生成的代理类。
需要注意的是,CGLIB生成的类名、方法名和其他细节在实际使用中可能会有所不同,并且通常会包含一些CGLIB内部的特定标识符。上面的代码只是为了说明CGLIB如何工作,并非实际生成代码的准确表示。在实际应用中,你通常不需要关心这些细节,因为CGLIB会自动处理这些过程。如果你想查看或分析生成的代理类,可以使用Java反编译工具来查看 .class
文件的内容。