我需要为给定的com.google.protobuf.Descriptors.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方面来看,基于Descriptor我需要创建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);
但在这种情况下,我无法将其转换为 Foo 或 Bar 类。有没有其他方法可以使用Descriptor或Descriptor名称创建newBuilder()?
盲目地我需要给定类名的newBuilder():
Message.Builder message = SomeUtilClass.getNewBuilder("Foo");
答案 0 :(得分:1)
您无法从Builder
创建Descriptor
。 Descriptor
没有关于它需要创建的proto(或builder)类的类型信息,因为所有Descriptor
个实例属于同一个类(it's final)。
如果您只能使用Descriptor
,那么您的if/else
大致可以获得。 (我粗略地说,因为你可以用地图或开关代替它;但它基本上是一样的。)
更好的方法是使用您尝试创建的proto的默认实例(或该proto的任何其他实例;但默认实例最难获取)。
Message prototype = Foo.getDefaultInstance(); // Or Bar.getDefaultInstance().
因为从Message
你可以得到一个构建器和描述符:
Message.Builder builder = prototype.newBuilderForType();
Descriptor descriptor = prototype.getDescriptorForType();