首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字节伙伴而不是MethodDelegation定义方法体

使用字节伙伴而不是MethodDelegation定义方法体
EN

Stack Overflow用户
提问于 2019-03-26 17:48:25
回答 1查看 397关注 0票数 4

我正在尝试使用Byte Buddy在其中生成一个类和方法,基于在运行时可用的一些配置。这个类正在尝试创建一个Hazelcast Jet管道来连接多个IMaps。

根据所提供的配置,no.要加入的IMaps的数量可能会有所不同。在下面的示例中,我尝试加入三个IMaps。

代码语言:javascript
复制
private Pipeline getPipeline(IMap<String, Object1> object1Map, IMap<String, Object2> object2Map, 
        IMap<String, Object3> object3Map) {
    Pipeline p = Pipeline.create();

    BatchStage<Entry<String, Object1>> obj1 = p.drawFrom(Sources.map(object1Map));
    BatchStage<Entry<String, Object2>> obj2 = p.drawFrom(Sources.map(object2Map));
    BatchStage<Entry<String, Object3>> obj3 = p.drawFrom(Sources.map(object3Map));

    DistributedFunction<Tuple2<Object1, Object2>, String> obj1Obj2JoinFunc = entry -> entry.f1().getField31();
    DistributedBiFunction<Tuple2<Object1, Object2>, Object3, Tuple2<Tuple2<Object1, Object2>, Object3>> output = (
        in1, in2) -> (Tuple2.tuple2(in1, in2));

    BatchStage<Tuple2<Object1, Object2>> obj1_obj2 = obj1.map(entry -> entry.getValue())
            .hashJoin(obj2.map(entry -> entry.getValue()),
                    JoinClause.onKeys(Object1::getField11, Object2::getField21), Tuple2::tuple2).filter(entry -> entry.getValue() != null);

    BatchStage<Tuple2<Tuple2<Object1, Object2>, Object3>> obj1_obj2_obj3 = obj1_obj2.hashJoin(
            obj3.map(entry -> entry.getValue()),
            JoinClause.onKeys(obj1Obj2JoinFunc, Object3::getField31), output)
            .filter(entry -> entry.getValue() != null);

    // the transformResult method will get the required fields from above operation and create object of AllObjectJoinClass
    BatchStage<Entry<String, AllObjectJoinClass>> result = transformResult(obj1_obj2_obj3);
    result.drainTo(Sinks.map("obj1_obj2_obj3"));
    return p;

}

这里的问题是。我的方法的参数数量取决于运行时配置,这也决定了方法体。我能够使用TypeDescription.Generic.Builder.parameterizedType生成方法签名。但是,我在生成方法体时遇到了问题。我尝试使用MethodDelegation.to,以便该方法驻留在单独的类中。这种方法的问题是,单独类中的方法需要是非常泛型的,以便它可以接受任意的no。不同类型的参数,并且还需要知道IMap中每个对象的字段。

我想知道是否有一种替代方法来实现这一点,也许可以使用某种类型的模板,以便可以使用该主体为每个管道生成一个单独的类。我没有找到任何文档来生成具有已定义主体的方法(可能我遗漏了一些东西)。

-- Anoop

EN

回答 1

Stack Overflow用户

发布于 2019-03-27 05:52:03

这在很大程度上取决于你想要做什么:

  1. 使用Advice,您可以将模板编写为内联到方法中的字节码。
  2. 使用StackManipulations,您可以编写单独的字节码指令。

在我看来,选项(2)是您的目标。对于单独编写的代码,这通常是最简单的选择。

编写单独的字节代码当然不是最方便的选择,但如果您可以轻松地编写对每个输入的处理,则可以编写多个Advice类以避免直接使用字节码指令。

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

https://stackoverflow.com/questions/55354066

复制
相关文章

相似问题

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