Java中的Google Protobufs:如何从FieldDescriptor获取Message.Builder?

时间:2015-01-27 00:57:12

标签: java buffer protocols protocol-buffers

我有一个FieldDescriptor,用于在我的协议缓冲区中定义的消息字段。我想开始为该字段构造一个值,但我不得不尝试为该FieldDescriptor获取Message.Builder。我正在编写的代码非常通用 - 它设计用于在MongoDB和协议缓冲区之间进行序列化 - 所以我不能对我今天碰巧使用的对象使用任何专用逻辑。

FieldDescriptor的JavaType是MESSAGE。它的MessageType有点好,因为它包含消息的Type,但Type在协议缓冲区命名空间中,所以我仍然不能使用反射来获取它的消息(至少不是干净利落)。

我不知道还能做什么。任何人都知道如何从FieldDescriptor构建Message.Builder?

1 个答案:

答案 0 :(得分:4)

如果您有包含类型的构建器的实例,则可以使用以下字段获取该字段的构建器:

containingBuilder.getFieldBuilder(fieldDescriptor)

或者您可以获得字段类型消息的新构建器(但不是特定于现有实例的字段):

containingBuilder.newBuilderForField(fieldDescriptor)

如果您根本没有包含类型的实例,但是您知道包含类,则可以执行以下操作:

ContainingType.getDefaultInstanceForType()
              .getField(fieldDescriptor)
              .newBuilderForType()

如果你甚至不知道包含的类(也许它甚至不在你的jar中),并且你所拥有的只是一个描述符,那么你可以使用DynamicMessage

DynamicMessage.newBuilder(fieldDescriptor)

但是,请注意DynamicMessage仅模拟真实类的反射界面;它实际上不是真实类的实例(由protoc生成)。而且,它比真正的类慢很多。