千家信息网

如何编写代码来实现内部之间调用拦截

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍"如何编写代码来实现内部之间调用拦截",在日常操作中,相信很多人在如何编写代码来实现内部之间调用拦截问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何编
千家信息网最后更新 2025年01月18日如何编写代码来实现内部之间调用拦截

这篇文章主要介绍"如何编写代码来实现内部之间调用拦截",在日常操作中,相信很多人在如何编写代码来实现内部之间调用拦截问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何编写代码来实现内部之间调用拦截"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

下面是CGLib的原生写法(使用net.sf.cglib.proxy.*包内的类实现)

class Foo {public void fun1(){        System.out.println("fun1");        fun2();    }public void fun2() {        System.out.println("fun2");    }}class CGlibProxyEnhancer implements MethodInterceptor{public Object getProxy(Class clazz) {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(clazz);        enhancer.setCallback(this);return enhancer.create();    }@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {        System.out.print("before ");Object result = proxy.invokeSuper(obj,args);return result;    }}public class Test {public static void main(String[] args) {        CGlibProxyEnhancer pf = new CGlibProxyEnhancer();        Foo foo = (Foo) pf.getProxy(Foo.class);        foo.fun1();    }}

打印结果是:
before fun1
before fun2
可以看到,虽然fun2()是通过foo.fun1()调用的,但fun()2依然能被代理。

但如果用Spring AOP那套基本写法的话:

class Foo {public void fun1() {System.out.println("fun1");        fun2();    }public void fun2() {System.out.println("fun2");    }}class Before implements MethodBeforeAdvice {public void before(Method method, Object[] objects, Object o) throws Throwable {System.out.print("before ");    }}public class TestCGLib {public static void main(String[] args) {        Foo foo = new Foo();        BeforeAdvice advice = new Before();        ProxyFactory pf = new ProxyFactory();        pf.setOptimize(true);//启用Cglib2AopProxy创建代理        pf.setProxyTargetClass(true);        pf.setTarget(foo);        pf.addAdvice(advice);        Foo proxy = (Foo) pf.getProxy();        proxy.fun1();    }}

输出结果是:
before fun1
fun2
可见fun2方法没有被代理。

这个帖子中还说到了如何将cglib中的fun2改为private则最终结果与常规AOP的一样.

到此,关于"如何编写代码来实现内部之间调用拦截"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0