1
我想拦截所有使用@Inject注解的方法。下面的测试表明,它可以很好地处理方法,但它不与构造函数一起使用。我错过了什么?如何拦截构造函数
我试着添加一个自定义的方法匹配器,我注意到我从来没有给过与构造函数相对应的MethodDescription。
public class InterceptConstructorTest {
@Test
public void testConstructorInterception() {
ByteBuddyAgent.install();
new AgentBuilder.Default().type(nameStartsWith("test")).transform(new AgentBuilder.Transformer() {
@Override
public Builder<?> transform(Builder<?> builder, TypeDescription td) {
return builder.method(isAnnotatedWith(Inject.class))
.intercept(MethodDelegation.to(MethodInterceptor.class).andThen(SuperMethodCall.INSTANCE));
}
}).installOnByteBuddyAgent();
// Call constructor => NOT intercepted
MyClass myClass = new MyClass("a param");
// Call method => intercepted
myClass.aMethod("a param");
}
}
class MyClass {
@Inject
public MyClass(String aParam) {
System.out.println("constructor called");
}
@Inject
public void aMethod(String aParam) {
System.out.println("aMethod called");
}
}
class MethodInterceptor {
public static void intercept(@Origin Method method) {
System.out.println("Intercepted: " + method.getName());
}
}
输出:
constructor called
Intercepted: aMethod
aMethod called
我试着用“构造函数”和“invokeable”,我得到以下例外(版本0.7.5):http://pastebin.com/peUnSdDw – user3408654
您正在使用@Origin和Method类型,其中Constructor应该是用过的。 Byte Buddy应该知道,它是一个bug。你需要使用Constructor作为该拦截器的类型。 –
哦,对,谢谢!现在我更好地理解异常消息。我不知道反射API在构造函数和方法之间做了区分。在构建器上有方法/构造器/可调用也更有意义。 – user3408654