Java代理- CGLIB代理应用片段分析

public class CglibProxy implements MethodInterceptor, ICacheProxy {

    /**
     * 被代理的对象
     */
    private final ICache target;

    public CglibProxy(ICache target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
        ICacheProxyBsContext context = CacheProxyBsContext.newInstance()
                .method(method).params(params).target(target);

        return CacheProxyBs.newInstance().context(context).execute();
    }

    @Override
    public Object proxy() {
        Enhancer enhancer = new Enhancer();
        //目标对象类
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        //通过字节码技术创建目标对象类的子类实例作为代理
        return enhancer.create();
    }

}

public Object proxy() 方法是 CglibProxy 类中的一个核心方法,用于创建目标对象的代理实例。这里使用了 CGLIB(Code Generation Library)框架,通过字节码生成技术,动态生成目标类的子类,并为其创建代理对象。

1. Enhancer enhancer = new Enhancer();

  • 这一行创建了一个 Enhancer 对象。Enhancer 是 CGLIB 提供的一个类,用于生成目标类的子类,从而实现动态代理。CGLIB 通过生成目标类的子类代理目标类的方法,而不依赖于接口实现。

2. enhancer.setSuperclass(target.getClass());

  • 设置目标类的超类为 target.getClass(),也就是说,代理类将会继承目标类。这里的 target 是被代理的对象,它是通过 CglibProxy 的构造函数传入的。通过这个方法,CGLIB 会在运行时生成一个目标类的子类。

3. enhancer.setCallback(this);

  • 这行代码设置回调对象,这个回调对象是 this,即当前的 CglibProxy 实例。CglibProxy 实现了 MethodInterceptor 接口,因此回调时会调用 intercept 方法。每当代理对象的方法被调用时,CGLIB 都会将调用委托给 intercept 方法,以此实现自定义的逻辑(如缓存增强、日志记录等)。

4. return enhancer.create();

  • 这一行代码通过 enhancer.create() 创建目标类的代理对象。enhancer.create() 方法会生成一个目标类的子类实例,并且这个实例会代理目标类的所有非 final 方法。在这个子类实例中,方法调用将会被拦截,实际执行时调用的是代理类的 intercept 方法,从而实现增强。

总结:

proxy() 方法使用 CGLIB 生成一个代理对象,代理类是目标类的子类,并且代理类中的方法调用会通过 MethodInterceptor 接口的 intercept 方法进行拦截,以实现自定义的行为,比如日志记录、事务管理、或在该示例中可能是缓存操作。这个方法通过动态字节码生成,能够在不修改目标类的前提下,动态扩展目标类的功能。

我们可以将这个方法用在其他场景中,比如在缓存系统中,当某些方法被调用时,使用 intercept 来实现缓存逻辑。这种方式可以使得代码具备良好的扩展性和维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫客36

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值