我正在尝试使用字节伙伴来处理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。
谢谢
答案 0 :(得分:3)
根据存在的类型信息,这是不可能的。您可以将方法的通用表示形式创建为MethodDescription
,以使静态类型兼容。作为一种更简单的解决方案,您只需配置添加
withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)
其中Byte Buddy只是简单地转换了通用类型,这也是通用分配的结果。