首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指定@Morph参数时无法运行ByteBuddy拦截器

指定@Morph参数时无法运行ByteBuddy拦截器
EN

Stack Overflow用户
提问于 2020-06-17 19:04:25
回答 1查看 205关注 0票数 1

我需要根据一些输入创建一个自定义类。我的自动取款机是:

代码语言:javascript
复制
    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。所以我做了:

代码语言:javascript
复制
public interface Morphing<T> {
    T invoke(Object[] args);
}

我的拦截器:

代码语言:javascript
复制
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:示例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-01 22:37:30

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62436517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档