有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我需要根据一些输入创建一个自定义类。我的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()

我在这里所做的是用一个方法创建一个类,该方法将委托给提供的方法。但是,created方法和delegate方法的参数略有不同。创建的方法还有一个参数(在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是否仅用于子类,而不是在委托给另一个实例时使用

编辑2:example


共 (1) 个答案

  1. # 1 楼答案

    Byte Buddy正在绑定Object类的一个方法,这样就不会再触发所需的拦截器。可以在withDefaultConfiguration()之后添加filter(isDeclaredBy(MyInterceptor.class))来避免这种情况。这样做,您将得到一个异常,Byte Buddy无法绑定任何方法

    @Morph使类不可调的原因是没有要调用的超级方法。在您的示例中,您正在定义一个没有原始实现的新方法。需要重写现有方法才能使用注释