- ベストアンサー
リフレクションでフィールドのインスタンス取得
- リフレクションを使ってフィールドの型やオブジェクトのタイプ、名前などは取得できるが、それ自身のインスタンスを取得できない。
- ClassオブジェクトのnewInstanceでは新しく作ってしまうため、目的のインスタンスを取得する方法はないのか。
- Barからfoo1, foo2のメソッドを呼び出したいが、Fooの定義数がわからないため、リフレクションを使用してFooのClassやFieldを取得できるが、Fooのインスタンスそのものを取得したい。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
インスタンスメソッドは、インスタンスを経由する(=該当インスタンスをBarのインスタンスに渡す)以外にアクセス出来ないと思います。 Barクラスの方でコンストラクターに引数を付けるか、またはインスタンスを得るための専用メソッドを作成する必要があると思います。このときに渡したインスタンスをvisitorと呼んだりします。 デザインパターンのvisitor patternを調べてみるとよいでしょう。 個数が不定なら、配列かArrayListにして渡すというのはどうでしょう? // // 以下例文 とりあえず配列を使う方法:引数での受け取り側では長さを指定なくてもよいことに注目 class Bar{ private Foo[] fooArray = new Foo[0]; // 配列の長さを調べるときにNullPointerExceptionが発生しないようにするため長さ0で初期化。 Bar(){ // Fooの個数が確定しないときに呼ぶコンストラクター、fooArrayはまだ使えないことに注意 } Bar(Foo[] foos){ fooArray = foos; } void setFooArray(Foo[] foos){ // visitorを得るためのメソッド fooArray = foos; } void nanikasuru(){ if( fooArray.length>0){ // 中身のある配列になっているかチェックしてから作業開始 for( int i=0; i<fooArray.length; i++){ fooArray[i].fooMethod(); } } } } class Parent{ Foo foo1,foo2; Bar bar; Parent(){ foo1=new Foo(); foo2=new Foo(); } void parentMethod(){ // 配列を一括して初期化する手法を適用すれば、渡す側で個数を確定出来る bar = new Bar(new Foo[]{foo1,foo2}); bar.nanikasuru(); } } // // こんなところでどうでしょ?
お礼
ありがとうございます。 FooとBarはライブラリでParentはユーザーのコードで できれば、FooとBarを定義するだけで、Fooから呼び出してくれる というのをやりたかったのですが、 インスタンスを渡すか、Listerをつけるかというのになりそうですね。 どうもありがとうございました。