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

Java 多方法拦截和拦截器重用,java,byte-buddy,Java,Byte Buddy,这里是我的用例:我有一个类,它有多个我想要截取的方法,但我不想截取这个类的所有方法。我想使用同一个拦截器类的不同实例来实现这一点。当我试着这么做的时候,我看到的行为是我无法理解的。我很确定这是我不理解的事情和/或我做错了的事情,但我被难住了。我使用的是Byte Buddy 1.6.9 类,我要截取其方法: public class MyClass { private Logger logger = LoggerFactory.getLogger(this.getClass().getNa

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

类,我要截取其方法:

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");        
    }
}
拦截器类别:

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();
    }

}
输出:

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

如果我这样做:

    FirstMethodInterceptor firstMethodInterceptor = new FirstMethodInterceptor();
    SecondMethodInterceptor secondMethodInterceptor = new SecondMethodInterceptor();

然后我看到了我期望的行为;i、 例如,每个拦截器只对每个被截获的方法调用一次。我希望避免这种情况,因为我希望能够在不看到这种行为的情况下重用“通用”拦截器。Insight将不胜感激,谢谢。

是的,像往常一样,这是我做错了。这是记录器的工件,而不是字节伙伴的工件。正在为同一个记录器实例注册多个日志处理程序,这就是导致此问题的原因

    FirstMethodInterceptor firstMethodInterceptor = new FirstMethodInterceptor();
    SecondMethodInterceptor secondMethodInterceptor = new SecondMethodInterceptor();