簡體   English   中英

ByteBuddy 泛型方法返回轉換為具體類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM