当指定@Morph参数时,无法运行ByteBuddy拦截器。

问题描述 投票:1回答:0

我需要根据一些输入创建一个自定义类。我现在有的就是这个。

    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 仅用于子类,而不是在委托给另一个实例时使用?

java byte-buddy
© www.soinside.com 2019 - 2024. All rights reserved.