Java 使用com.google.protobuf.Descriptor.Descriptor创建新的生成器

Java 使用com.google.protobuf.Descriptor.Descriptor创建新的生成器,java,protocol-buffers,Java,Protocol Buffers,我需要为给定的com.google.protobuf.Descriptor.Descriptor创建一个类的newBuilder() 我使用google proto buffer为以下协议创建了一个jar: message Foo { optional uint32 id = 1; optional string fooName = 2; } message Bar { optional uint32 id = 1; optional string barName = 2; }

我需要为给定的com.google.protobuf.Descriptor.Descriptor创建一个类的newBuilder()

我使用google proto buffer为以下协议创建了一个jar:

message Foo
{
  optional uint32 id = 1;
  optional string fooName = 2;
}
message Bar
{
  optional uint32 id = 1;
  optional string barName = 2;
}
从Java方面,我需要基于描述符创建newBuilder()。 例如:

    Message.Builder message;
    if(Descriptor.getName().equals("Foo"))
        message = Foo.newBuilder();
    if(Descriptor.getName().equals("Bar"))
        message = Bar.newBuilder();
但我不想选择“如果”或“换个案子”。 我还尝试了使用DynamicMessage的其他方法

Message.Builder message = DynamicMessage.newBuilder(descriptor);
但在这种情况下,我无法将其放入FooBar类中。使用描述符或描述符名称创建newBuilder()还有其他方法吗

我盲目地需要给定类名的newBuilder(),如下所示:

Message.Builder message = SomeUtilClass.getNewBuilder("Foo");

无法从
描述符创建
生成器
描述符
没有需要创建的proto(或builder)类的类型信息,因为所有
描述符
实例都属于同一个类()

如果您只能使用
描述符
,则您的
If/else
大致与您所能获得的一样好。(我粗略地说,因为你可以用地图或开关来代替;但基本上是一样的)

更好的方法是使用您试图创建的proto的默认实例(或该proto的任何其他实例;但默认实例最容易获得)

因为从中可以同时获得生成器和描述符:

Message.Builder builder = prototype.newBuilderForType();
Descriptor descriptor = prototype.getDescriptorForType();

我倾向于发现传递
Foo.getDefaultInstance()
比传递其描述符更容易;然后你可以得到它的生成器和描述符。实际上我的问题是我没有实际的Foo或Bar。我只有Foo或Bar的描述符。使用该描述符,我需要创建新的生成器。目前,我们正在使用if-else条件创建新的生成器。我想最小化代码。对。我的意思是:如果可以,不要传递描述符,而是传递proto的默认实例,因为它a)有更多的类型信息;b) 用于获取描述符和生成器。您的设计(即您传递描述符)使其变得比需要的更困难。是的,我需要的是从描述符或描述符的任何其他字段创建一个生成器。避免使用if-else或switch。因为我们有更多像Foo这样的类,BarOk将尝试使用DefaultInstance。我盲目地需要给定类名的newBuilder(),比如Message.Builder Message=SomeUtilClass.getNewBuilder(“Foo”);然后,
SomeUtilClass.getNewBuilder
需要一个与当前类似的if/else链;或开关;或者一张地图。这比只使用
描述符更糟糕。好的,没有问题会将if-else移到某个util。谢谢您的指导。顺便说一句:使用
getFullName()
,而不是
getName()
,以避免名称冲突。
Message.Builder builder = prototype.newBuilderForType();
Descriptor descriptor = prototype.getDescriptorForType();