CGLIB动态代理生成什么样的代理类?

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 方法被调用时,实际上调用的是 MethodInterceptorintercept 方法。

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 文件的内容。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值