我有一个在 Protocol Buffer 中定义的消息字段的 FieldDescriptor。我想开始为该字段构造一个值,但我一直在尝试为该 FieldDescriptor 获取 Message.Builder。我正在编写的代码非常通用 - 它旨在在 MongoDB 和 Protocol Buffers 之间进行序列化 - 因此我无法对我今天碰巧使用的对象使用任何专门的逻辑。
FieldDescriptor 的 JavaType 是 MESSAGE。它的 MessageType 好一点,因为它包含消息的 Type,但 Type 位于 Protocol Buffer 命名空间中,所以我仍然无法使用反射来获取它的 Message(至少不能干净地)。
我不知道还能做什么。有人知道如何从 FieldDescriptor 构造 Message.Builder 吗?
最佳答案
如果您有包含类型的构建器的实例,则可以通过以下方式获取该字段的构建器:
containingBuilder.getFieldBuilder(fieldDescriptor)
或者您可以为字段类型的消息获取一个新的构建器(但不是特定于现有实例的字段):
containingBuilder.newBuilderForField(fieldDescriptor)
如果您根本没有包含类型的实例,但您知道包含类,则可以执行以下操作:
ContainingType.getDefaultInstanceForType()
.getField(fieldDescriptor)
.newBuilderForType()
如果您甚至不知道包含的类(也许它甚至不在您的 jar 中),并且您拥有的只是一个描述符,那么您可以使用 DynamicMessage
:
DynamicMessage.newBuilder(fieldDescriptor)
但是请注意,DynamicMessage
仅模拟真实类的反射接口(interface);它实际上并不是真实类的实例(由 protoc
生成)。而且,它比真正的类(class)慢很多。
关于java - Java : How do you get a Message. Builder 中的 Google Protobufs 来自 FieldDescriptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28161527/