ByteBuddy 通用方法 return 转换为具体类型
ByteBuddy generic method return cast to concrete type
我正在尝试使用 byte buddy 来处理 protobuf 数据,但很难使用通用扩展 APIs。
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 的 return 类型,以便我可以将其设置为构建器类型 messageBuilderType?我找不到显式添加强制转换的方法,也找不到 API 来覆盖方法 return.
谢谢
从现有的类型信息来看,这是不可能的。您可以将方法的通用表示创建为 MethodDescription
以使静态类型兼容。作为更简单的解决方案,您只需配置 add
withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)
其中 Byte Buddy 只是转换泛型类型,这也是泛型赋值的结果。
我正在尝试使用 byte buddy 来处理 protobuf 数据,但很难使用通用扩展 APIs。
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 的 return 类型,以便我可以将其设置为构建器类型 messageBuilderType?我找不到显式添加强制转换的方法,也找不到 API 来覆盖方法 return.
谢谢
从现有的类型信息来看,这是不可能的。您可以将方法的通用表示创建为 MethodDescription
以使静态类型兼容。作为更简单的解决方案,您只需配置 add
withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)
其中 Byte Buddy 只是转换泛型类型,这也是泛型赋值的结果。