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
来实现缓存逻辑。这种方式可以使得代码具备良好的扩展性和维护性。