[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()))));
这是必要的,因为后面的匹配器会覆盖任何先前也匹配方法的匹配器。最具体的匹配器需要最后应用,拦截器不会堆叠。
但是,您似乎应该在此处重构您的拦截逻辑,以消除这一点。
我的代码中有一个方法 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()))));
这是必要的,因为后面的匹配器会覆盖任何先前也匹配方法的匹配器。最具体的匹配器需要最后应用,拦截器不会堆叠。
但是,您似乎应该在此处重构您的拦截逻辑,以消除这一点。