[英]ByteBuddy generic method return cast to concrete type
我正在嘗試使用 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。
謝謝
從存在的類型信息來看,這是不可能的。 您可以創建方法的通用表示作為MethodDescription
以使靜態類型兼容。 作為更簡單的解決方案,您只需配置 add
withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC)
其中 Byte Buddy 只是轉換泛型類型,這也是泛型賦值的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.