带有增强类过滤功能的cglib代理

本文通过具体示例展示了如何利用Cglib实现方法级别的增强功能。通过对特定方法(如setName和getName)应用不同的拦截逻辑,文章详细介绍了如何配置Cglib以实现前置和后置增强,并对比了使用自定义拦截器与NoOp.INSTANCE的区别。
摘要由CSDN通过智能技术生成
import java.lang.reflect.Method;

import net.sf.cglib.proxy.CallbackFilter;

/**
 * 返回值表示使用第几个advice(Callback[]的索引)
 */
public class MyCglibCallbackFilter implements CallbackFilter{
    @Override
    public int accept(Method method) {
        if(method.getName().equals("setName"))
            return 0;
        if(method.getName().equals("setSchool"))
            return 0;
        if(method.getName().equals("getName"))
            return 1;
        if(method.getName().equals("getSchool"))
            return 1;
        return 0;
    }
}
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//代理类
public class MyCglibIntecepter implements MethodInterceptor{

    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        Object result=null;

        before();
        result =  proxy.invokeSuper(obj, args);
        after();

        return result;
    }

    private void before(){
        System.out.println("cglib前置增强");
    }

    private void after(){
        System.out.println("cglib后置增强");
    }
}

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.NoOp;

import com.ziguan.test.Student;
import com.ziguan.test.StudentI;

public class TestCglibProxyWithFilter {


    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Student.class);
        enhancer.setCallbackFilter(new MyCglibCallbackFilter());
        Callback c1 = new MyCglibIntecepter();
        Callback c2 = NoOp.INSTANCE;
        Callback[] callbacks = new Callback[]{c1, c2};
        enhancer.setCallbacks(callbacks);

        StudentI proxyInstance = (StudentI)enhancer.create();
//      proxyInstance.setName("peter");
        proxyInstance.getName();

    }
}

测试结果:
当调用student类的setXXX方法时执行MyCglibIntecepter增强,
当调用student类的setXXX方法时执行NoOp.INSTANCE增强,也就是没有任何操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_26182553

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

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

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

打赏作者

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

抵扣说明:

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

余额充值