CGLib 中 CallbackFilter 的使用

文章介绍了如何在CGLib中使用CallbackFilter,实现对ProxyService类的不同方法执行不同的代理逻辑,允许针对特定方法定制额外功能。
摘要由CSDN通过智能技术生成

CGLib 中 CallbackFilter 的使用

CGLib 的常规使用

  1. 定一个一个类,里面有两个方法
public class ProxyService {

	// 测试方法一
    public void proxyMethod1() {
        System.out.println("method1 ....");
    }

	// 测试方法二
    public void proxyMethod2() {
        System.out.println("method2 ....");
    }
    
}
  1. 通过 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();
    }
  1. 执行结果如下:
    在这里插入图片描述
    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 的使用,对不同方法,执行不同的代理逻辑。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值