ByteBuddy泛型方法返回强制转换为具体类型

时间:2019-08-17 06:47:33

标签: java byte-buddy

我正在尝试使用字节伙伴来处理protobuf数据,并且难以使用通用扩展API。

DynamicType.Builder<?> addSetter(final Class<? extends Message> container,
                                 final GeneratedExtension<?, ?> extension,
                                 final DynamicType.Builder<?> builder) throws NoSuchMethodException {
Method toBuilderMethod = container.getMethod("toBuilder");
Class<?> messageBuilderType = toBuilderMethod.getReturnType();

// generic return type is com.google.protobuf.GeneratedMessage.ExtendableBuilder
Method setterMethod = messageBuilderType.getMethod("setExtension", GeneratedExtension.class, Object.class);
Method buildMethod = messageBuilderType.getMethod("build");

MethodCall toBuilder = invoke(toBuilderMethod).onArgument(0);
MethodCall setit = invoke(setterMethod).onMethodCall(toBuilder).with(extension).withArgument(1);
MethodCall body = invoke(buildMethod).onMethodCall(setit) ;

return builder.method(named("set0")).intercept(body);

这是protobuf的代码

public abstract static class ExtendableBuilder<
        MessageType extends ExtendableMessage,
        BuilderType extends ExtendableBuilder>
      extends Builder<BuilderType>
...
public final <Type> BuilderType setExtension(
        final GeneratedExtension<MessageType, List<Type>> extension,
        final int index, final Type value) {
...

有什么方法可以更改setit的返回类型,以便将其设置为生成器类型messageBuilderType吗?我找不到显式添加强制类型转换的方法,也找不到覆盖方法返回的API。

谢谢

1 个答案:

答案 0 :(得分:3)

根据存在的类型信息,这是不可能的。您可以将方法的通用表示形式创建为MethodDescription,以使静态类型兼容。作为一种更简单的解决方案,您只需配置添加

withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)

其中Byte Buddy只是简单地转换了通用类型,这也是通用分配的结果。