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

[byte-buddy]Why only last interceptor works

我的代码中有一个方法 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 有效。
我有很多拦截器。 我需要做什么?

你必须自己添加一个 most-specific 匹配器并在那里自己指定拦截器:

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

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

但是,您似乎应该在此处重构您的拦截逻辑,以消除这一点。