指定@Morph 参数时无法运行 ByteBuddy 拦截器
Not able to run ByteBuddy interceptor when @Morph argument is specified
我需要根据一些输入创建自定义 classes。我的atm是这样的:
final Class service = ...;
final Method method = ...;
final DynamicType.Unloaded unloadedType = new ByteBuddy()
.subclass(Object.class)
.name(service.getClass().getSimpleName() + "DynamicResolver")
.defineMethod(
endpointName,
resolveReturnType(method),
Modifier.PUBLIC)
.withParameters(parameters)
.intercept(MethodDelegation
.withDefaultConfiguration()
.withBinders(Morph.Binder.install(Morphing.class))
.to(interceptor).andThen(
MethodCall.invoke(method).on(service).withArgument(arguments)
))
.make()
我在这里所做的是创建一个 class,其中包含一个委托给提供的方法。但是,创建的方法和委托方法的参数有些不同。创建的方法多了一个参数(在 parameters
中)。创建的方法不采用该参数,因此 arguments
数组带有参数索引(少一个参数)。
到目前为止一切正常。现在,我需要在调用委托方法时 添加 附加参数。为了示例的简单起见,假设我们必须再添加一个字符串来委托调用。
正如我从文档中看到的那样,操作参数的方法是使用 @Morph
。所以我做了:
public interface Morphing<T> {
T invoke(Object[] args);
}
和我的拦截器:
public class Interceptor {
@RuntimeType
public Object invoke(
@Morph final Morphing<Integer> m,
@AllArguments final Object[] args
) {
System.out.println("!!!");
return m.invoke(args);
}
}
不幸的是,这不起作用。当我删除 @Morph
参数时,拦截器被调用。
我在这里错过了什么?
编辑:@Morph
是否仅用于子 classes 而不是在委托给另一个实例时?
编辑 2:example
Byte Buddy 正在绑定 Object
class 的方法,以便不再触发您想要的拦截器。您可以在 withDefaultConfiguration()
之后添加 filter(isDeclaredBy(MyInterceptor.class))
来避免这种情况。这样做,您将得到一个异常,字节好友无法绑定您的任何方法。
@Morph
使 class 不合格的原因是没有要调用的超级方法。在您的示例中,您正在定义一个没有原始实现的新方法。您需要覆盖现有方法才能使用注释。
我需要根据一些输入创建自定义 classes。我的atm是这样的:
final Class service = ...;
final Method method = ...;
final DynamicType.Unloaded unloadedType = new ByteBuddy()
.subclass(Object.class)
.name(service.getClass().getSimpleName() + "DynamicResolver")
.defineMethod(
endpointName,
resolveReturnType(method),
Modifier.PUBLIC)
.withParameters(parameters)
.intercept(MethodDelegation
.withDefaultConfiguration()
.withBinders(Morph.Binder.install(Morphing.class))
.to(interceptor).andThen(
MethodCall.invoke(method).on(service).withArgument(arguments)
))
.make()
我在这里所做的是创建一个 class,其中包含一个委托给提供的方法。但是,创建的方法和委托方法的参数有些不同。创建的方法多了一个参数(在 parameters
中)。创建的方法不采用该参数,因此 arguments
数组带有参数索引(少一个参数)。
到目前为止一切正常。现在,我需要在调用委托方法时 添加 附加参数。为了示例的简单起见,假设我们必须再添加一个字符串来委托调用。
正如我从文档中看到的那样,操作参数的方法是使用 @Morph
。所以我做了:
public interface Morphing<T> {
T invoke(Object[] args);
}
和我的拦截器:
public class Interceptor {
@RuntimeType
public Object invoke(
@Morph final Morphing<Integer> m,
@AllArguments final Object[] args
) {
System.out.println("!!!");
return m.invoke(args);
}
}
不幸的是,这不起作用。当我删除 @Morph
参数时,拦截器被调用。
我在这里错过了什么?
编辑:@Morph
是否仅用于子 classes 而不是在委托给另一个实例时?
编辑 2:example
Byte Buddy 正在绑定 Object
class 的方法,以便不再触发您想要的拦截器。您可以在 withDefaultConfiguration()
之后添加 filter(isDeclaredBy(MyInterceptor.class))
来避免这种情况。这样做,您将得到一个异常,字节好友无法绑定您的任何方法。
@Morph
使 class 不合格的原因是没有要调用的超级方法。在您的示例中,您正在定义一个没有原始实现的新方法。您需要覆盖现有方法才能使用注释。