2016-08-12 12 views
3

通常は、このようないるProtobufクラスのインスタンスを作成します。java reflectionを使用してprotobufインスタンスを作成するには?

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

を私がいるProtobufクラスをインスタンス化するJavaリフレクションを使用してユースケースを持っている:

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

上記のコードは、通常のJavaクラスと正常に動作します。しかし、生成されたprotobufクラス"com.xyz.Foo$Bar"の場合は、そこにデフォルトのpublicコンストラクタがないので、NoSuchMethodExceptionが表示されます。

Java refectionを使用してprotobufインスタンスを作成する方法に関する提案はありますか?問題は、protobuf内部を本当によく知っている人のためです。感謝!ビルダークラスを介して:

+0

clsBar.getConstructors()を呼び出し、返されたConstructorオブジェクトの1つで.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 $ Builder'ではなく 'Bar'クラスに属します。ありがとう! –

+0

@NathanWはそれを修正しました - 私は十分な注意を払っていないようです... – ppeterka

関連する問題