2016-08-12 264 views
3

通常你创建一个protobuf的类的实例是这样的:如何使用java反射创建protobuf实例?

Bar.Builder bld = Bar.newBuilder(); 
bld.setXYZ(... 

我有一个使用Java反射来实例化的protobuf类的用例:

Class clsBar = Class.forName("com.xyz.Foo$Bar"); 
Object instance = clsBar.newInstance(); // error here! 
Method mth = clsBar.getMethod(...); 

上面的代码工作正常与正常的Java类。但是对于生成的protobuf类"com.xyz.Foo$Bar",它给了我一个NoSuchMethodException,因为那里没有默认的公共构造函数。

有关如何使用Java反射创建protobuf实例的任何建议?问题在于那些擅长protobuf内部构件的人。谢谢!

+0

如果您调用clsBar.getConstructors()并在返回的构造函数对象之一上调用.newInstance()方法,该怎么办? – Duston

+0

你有什么信息?只有期望的课程或更多?如果你想从字节数组或类似的地方创建一个Protobuf实例,你可以使用'parseFrom'方法。 – dpr

+0

@Duston所有的构造函数都是私有的,就像protobuf实现一样。对于dpr,我只有生成protobuf类的全限定类名。 –

回答

3

我觉得你应该去充分的方式:通过生成器类:

//get Bar class 
Class barClass = Class.forName("com.xyz.Foo$Bar"); 

//instantiate Builder through newBuilder method 
Method newBuilderMethod = barClass.getMethod("newBuilder"); 
Bar.Builder builder = (Bar.Builder) newBuilderMethod.invoke(null); 

// ... set properties -- can be through reflection if necessary 

//build: 
Bar bar = builder.build(); 

虽然我不完全看反射是如何在这种情况下,任何使用,这可能会需要更深入的了解你正试图解决的确切问题。

+1

你的回答是正确的,但有一个小错误:“newBuilder”方法属于'Bar'类,而不是'Bar $ Builder'。谢谢! –

+0

@NathanW纠正了它 - 似乎我没有给予足够的重视...... – ppeterka