有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中的缓冲区Google Protobufs:如何获取消息。字段描述符的生成器?

我在协议缓冲区中定义了一个消息字段的字段描述符。我想开始为该字段构造一个值,但我一直在尝试获取消息。这个字段描述符的生成器。我写的代码非常通用——它被设计为在MongoDB和协议缓冲区之间序列化——所以我不能对我今天碰巧使用的对象使用任何专门的逻辑

FieldDescriptor的JavaType是MESSAGE。它的MessageType要好一点,因为它包含消息的类型,但类型在协议缓冲区名称空间中,所以我仍然无法使用反射为它获取消息(至少不是干净的)

我不知道还能做什么。任何人都知道如何构建消息。FieldDescriptor中的生成器


共 (1) 个答案

  1. # 1 楼答案

    如果有包含类型的生成器的实例,则可以通过以下方式获取字段的生成器:

    containingBuilder.getFieldBuilder(fieldDescriptor)
    

    或者,您可以为字段类型的消息(但不具体是现有实例的字段)获取新的生成器:

    containingBuilder.newBuilderForField(fieldDescriptor)
    

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

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

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

    DynamicMessage.newBuilder(fieldDescriptor)
    

    但是,请注意DynamicMessage只模拟真实类的反射接口;它实际上不是真实类的实例(正如protoc生成的那样)。而且,它比真正的类慢得多