首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多方法拦截和拦截器重用

多方法拦截和拦截器重用
EN

Stack Overflow用户
提问于 2017-04-20 20:53:19
回答 1查看 614关注 0票数 0

这是我的用例:我有一个类,它有多个我想截取的方法,但我不想截取这个类的所有方法。我想使用同一个拦截器类的不同实例来实现这一点。当我尝试这样做时,我看到了Byte Buddy中我不理解的行为。我很确定这是我不理解和/或我做错了什么,但我被难住了。我使用的是Byte Buddy 1.6.9。

要截取其方法的类:

代码语言:javascript
复制
public class MyClass
{
    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());

    public void firstInterceptedMethod()
    {
        logger.info("firstInterceptedMethod");
    }

    public void secondInterceptedMethod()
    {
        logger.info("secondInterceptedMethod");     
    }

    public void notInterceptedMethod()
    {
        logger.info("notInterceptedMethod");        
    }
}

拦截器类:

代码语言:javascript
复制
public class MyInterceptor
{
    private Logger logger = LoggerFactory.getLogger(this.getClass().getName());

    private final UUID identifier = UUID.randomUUID();

    @RuntimeType
    public Object methodCalled(@SuperCall Callable<?> superCall, @Origin Method method) throws Exception
    {
        logger.info("methodCalled: identifier: " + identifier);
        logger.info("methodCalled: method name: " + method.getName());

        return superCall.call();
    }

}

Byte Buddy测试/指令插入:

代码语言:javascript
复制
public class MyTest
{
    @Test
    public void test() throws Exception
    {
        MyInterceptor firstMethodInterceptor = new MyInterceptor();
        MyInterceptor secondMethodInterceptor = new MyInterceptor();

        MyClass myClass = new ByteBuddy().subclass(MyClass.class)
                .method(ElementMatchers.named("firstInterceptedMethod"))
                        .intercept(MethodDelegation.to(firstMethodInterceptor))
                .method(ElementMatchers.named("secondInterceptedMethod"))
                        .intercept(MethodDelegation.to(secondMethodInterceptor))
                .make()
                .load(MyClass.class.getClassLoader())
                .getLoaded()
                .newInstance(); 

        myClass.firstInterceptedMethod();
        myClass.secondInterceptedMethod();
    }
}

输出:

代码语言:javascript
复制
04/20/2017 08:27:26:600 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: identifier: 04124951-f865-4815-8bd4-0b10c0c816a2
04/20/2017 08:27:26:600 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: identifier: 04124951-f865-4815-8bd4-0b10c0c816a2
04/20/2017 08:27:26:613 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: method name: firstInterceptedMethod
04/20/2017 08:27:26:613 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: method name: firstInterceptedMethod
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyClass firstInterceptedMethod : INFO firstInterceptedMethod
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: identifier: 79590462-b87d-4125-9e87-5481e1062b05
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: identifier: 79590462-b87d-4125-9e87-5481e1062b05
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: method name: secondInterceptedMethod
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyInterceptor methodCalled : INFO methodCalled: method name: secondInterceptedMethod
04/20/2017 08:27:26:614 AM [main] bytebuddy.test.MyClass secondInterceptedMethod : INFO secondInterceptedMethod

我的问题是:为什么我看到每个拦截器被调用两次?当调用第一个方法时,第一个拦截器实例似乎被调用了两次,我不明白为什么会这样。与第二个方法的行为类似,只有第二个拦截器实例似乎被调用了两次。我希望拦截器在每次被拦截的方法调用时只被调用一次。

如果我这样做:

代码语言:javascript
复制
    FirstMethodInterceptor firstMethodInterceptor = new FirstMethodInterceptor();
    SecondMethodInterceptor secondMethodInterceptor = new SecondMethodInterceptor();

然后,我看到了我所期望的行为;即每个拦截器对于每个被拦截的方法只调用一次。我希望避免这种情况,因为我希望能够重用一个“公共的”拦截器,而不会看到这种行为。非常感谢你的洞察力,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-20 23:24:06

是啊,像往常一样这是我做错了什么。这是记录器的工件,而不是Byte Buddy的工件。正在为同一个记录器实例注册多个日志记录处理程序,这就是导致这种情况的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43520125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档