前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JDK之动态代理后方法间相互调用不触发拦截

JDK之动态代理后方法间相互调用不触发拦截

作者头像
克虏伯
发布2020-07-13 14:24:42
5771
发布2020-07-13 14:24:42
举报

    JDK版本1.8.

List-1

代码语言:javascript
复制
public interface Subject {

    void prePrint();

    void print();

    void postPrint();
}

List-2

代码语言:javascript
复制
public class HelloWorldSubject implements Subject {

    @Override
    public void prePrint() {
        System.out.println("pre");
    }

    @Override
    public void print() {
        prePrint();
        System.out.println("Hello world");
        postPrint();
    }

    @Override
    public void postPrint() {
        System.out.println("post");
    }
}

List-3

代码语言:javascript
复制
public class JdbcDynamicalProxy implements InvocationHandler {
    private Subject subject;

    public JdbcDynamicalProxy(Subject subject) {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println(method.getName()+" 前");
        Object result = method.invoke(subject, objects);
        System.out.println(method.getName()+" 后");
        return result;
    }
}

    来测试下,如下List-5是结果,我们在调用print后,print方法中调用了pre/postPrint方法,但是JDK的动态代理只是拦截了print方法并执行了拦截方法,但是pre/post方法的执行前后就不会执行,这也是为什么spring中有时候事务传播会失效、调用标有@AsynTask注解的方法——想用异步方式执行会失效的原因。

List-4

代码语言:javascript
复制
public class DynamicTest {

    @Test
    public void test(){
        HelloWorldSubject subject = new HelloWorldSubject();
        Subject instance = (Subject) Proxy.newProxyInstance(this.getClass().getClassLoader(), HelloWorldSubject.class.getInterfaces(), new JdbcDynamicalProxy(subject));
        instance.print();
    }
}

List-5

代码语言:javascript
复制
print 前
pre
Hello world
post
print后
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档