我需要根据一些输入创建一个自定义类。我的自动取款机是:
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()我在这里要做的是创建一个类,其中包含一个委托给提供的方法的类。但是,创建的方法和委托方法有一些不同的参数。创建的方法有多一个参数(在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是否仅用于子类,而不用于委托给另一个实例?
EDIT2:示例
发布于 2020-07-01 22:37:30
字节Buddy是绑定Object类的一个方法,以便不再触发所需的拦截器。您可以在filter(isDeclaredBy(MyInterceptor.class))之后添加withDefaultConfiguration()以避免这种情况。这样做,您将得到一个异常,即Buddy不能绑定您的任何方法。
@Morph使类不可移植的原因是没有可以调用的超级方法。在您的示例中,您正在定义一个没有原始实现的新方法。您需要重写现有的方法才能使用注释。
https://stackoverflow.com/questions/62436517
复制相似问题