[byte-buddy]为什么只有最后一个拦截器工作

时间:2018-03-08 05:36:39

标签: byte-buddy

我的代码中有一个方法testFoo,如下所示:

newClassBuilder = newClassBuilder.method(ElementMatchers.nameStartsWith("test"))
                                .intercept(MethodDelegation.to(new InstMethodsInter(new MethodInterceptor1())));
newClassBuilder = newClassBuilder.method(ElementMatchers.named("testFoo"))
                                .intercept(MethodDelegation.to(new InstMethodsInter(new MethodInterceptor2())));
newClassBuilder = newClassBuilder.method(ElementMatchers.nameEndsWith("Foo"))
                               .intercept(MethodDelegation.to(new InstMethodsInter(new MethodInterceptor3())));

只有MethodInterceptor3可以工作 我有很多拦截器。 我需要做什么?

1 个答案:

答案 0 :(得分:0)

你必须自己添加一个最具体的匹配器并自己指定拦截器:

newClassBuilder.method(ElementMatchers.nameStartsWith("test").and(ElementMatchers.named("testFoo"))
                            .intercept(MethodDelegation.to(new InstMethodsInter(new MethodInterceptor1()).andThen(MethodDelegation.to(InstMethodsInter(new MethodInterceptor2()))));

这是必要的,因为后面的匹配器会覆盖任何以前匹配方法的匹配器。最具体的匹配器需要最后应用,并且拦截器不会堆叠。

但是,您似乎应该在此处重构您的拦截逻辑,以使其不必要。