使用反射填充 Proto 中的地图字段 API

Filling up a map field in Proto using reflection API

我正在尝试编写一个模块,它将获得一个 Message.Builder 和一个从字段名称到值的映射,并将用这些值填充生成器。

一切正常,直到遇到地图字段(使用 Proto3)。

我得到了一条特定的消息,我知道我可以做的字段:

builder.b.putAll<MapeFieldName>( map ),

但是我如何使用 Proto 反射 API 来实现同样的效果。

MapEntry doc 说:“在反射 API 中,映射字段将被视为重复的消息字段,每个映射条目都作为消息访问." 但是我不太明白那是什么意思。

我在这上面浪费了一些时间,认为其他人可能会发现它有用:

在地图字段上使用原型反射 API 时,您确实将地图字段视为 com.google.protobuf.MapEntry:

的重复字段
FieldDescriptor mapFieldDescriptor = protoDescriptor.findFieldByName( map_field_name );
MapEntry.Builder entryBuilder = ( MapEntry.Builder ) topProtoBuilder.newBuilderForField( mapFieldDescriptor );

然后对于我地图中的每个条目:

entryBuilder.setKey( e.getKey() );
entryBuilder.setValue( e.getValue() );
underlyingProtoBuilder.addRepeatedField( mapFieldDescriptor , entryBuilder.build() );

唯一仍然困扰我的是 MapEntry 文档说:"Users shouldn't use this class" 当我不得不明确使用 MapEntry.Builder.

我也不确定为什么 protobuf 不让你简单地 builder.setField( mapFieldDescriptor ,一个 java Map )看起来更干净。