CGLib 中 CallbackFilter 的使用
CGLib 的常规使用
- 定一个一个类,里面有两个方法
public class ProxyService {
// 测试方法一
public void proxyMethod1() {
System.out.println("method1 ....");
}
// 测试方法二
public void proxyMethod2() {
System.out.println("method2 ....");
}
}
- 通过 CGLib 对该类进行代理,对其中方法进行增加额外功能
public static void main(String[] args) {
// 创建需要被代理的对象
ProxyService targetProxyService = new ProxyService();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProxyService.class);
enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {
/**
参数意义:
Object o:表示生成的代理对象,而非原始对象。
Method method:表示要被拦截的目标方法。
Object[] objects:表示方法参数的数组。
MethodProxy methodProxy:表示方法的代理。
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("proxy before ...");
Object invoke = method.invoke(targetProxyService, objects);
System.out.println("proxy after ...");
return invoke;
}
}});
// 创建代理对象,并使用代理对象执行方法
ProxyService proxyService = (ProxyService) enhancer.create();
proxyService.proxyMethod1();
System.out.println("------------------");
proxyService.proxyMethod2();
}
- 执行结果如下:
ProxyService 中的所有方法,都被进行了相同的方法增强。
若想要对不同的方法,进行不同的增强,则需要用到CallbackFilter
。
CallbackFilter 的使用
代码如下:
public static void main(String[] args) {
ProxyService targetProxyService = new ProxyService();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(ProxyService.class);
// 此处Callback的类型,是数组类型,可以传入多个参数
// NoOp.INSTANCE是一个空实现,代表不进行任何代理操作
enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("proxy before ...");
Object invoke = method.invoke(targetProxyService, objects);
System.out.println("proxy after ...");
return invoke;
}
}, NoOp.INSTANCE});
// 定义CallbackFilter
enhancer.setCallbackFilter(new CallbackFilter() {
// 该方法的返回值是核心:返回值是Callback数组的下标索引
// 若返回0,则代表执行Callback中,索引为0的回调方法
@Override
public int accept(Method method) {
// 若执行方法为proxyMethod1,则执行第一种回调方法
if ("proxyMethod1".equals(method.getName())) {
return 0;
} else {
return 1;
}
}
});
ProxyService proxyService = (ProxyService) enhancer.create();
proxyService.proxyMethod1();
System.out.println("------------------");
proxyService.proxyMethod2();
}
执行结果:
可以看出,Method1()
方法执行了 Callback[0]
的逻辑,其他方法,执行了Callback[1]
的逻辑。可以通过 CallbackFilter
的使用,对不同方法,执行不同的代理逻辑。