2012-11-22 19 views
7

クラスABがあります。BAです。私はまたBのコンストラクタを持っていて、1つの引数はAです。私はbObjと呼ばれるタイプBのオブジェクトも持っています。Java Reflection getConstructorメソッド

B.class.getConstructor(new Class[] { bObj.getClass() })を呼び出し、コンストラクタを取得する方法はありますか?BAになりますか?現時点では私はNoSuchMethodExceptionを得ています。

よろしく、 スタン

+2

何を試してみてください正確に1つの引数を取るものを見つけ、 'A.class'' isAssignableFrom'がこれをチェックするかどうかチェックします。 –

+0

はBのコンストラクタpublicですか? –

+0

arne.bこれはこれを行う1つの方法ですが、実際にはもっと簡単にできると思いました。 Nandkumarはい、公開されています。 –

答えて

6

Apache Commons Langからご覧ください。
これらはすべてコンストラクタの検出方法の仕方があります。

ケースには「Matching Accessible Constructors」が含まれている必要があります。

Hereは、文脈で使用される方法の例です。 は基本的に、あなたはこのようにそれを呼び出す:あなたのコードのスコープからはアクセスできませんあなたのコンストラクタが公開されていない場合(またはそれのクラスがパブリックでない場合)

private <T> T instantiate(Class<?> input, Object parameter) { 
    try { 
    Constructor<?> constructor = ConstructorUtils.getMatchingAccessibleConstructor(input, parameter.getClass()); 
    return (T) constructor.newInstance(parameter); 
    } catch (Exception e) { 
    //handle various exceptions 
    } 
} 
+3

これは完璧に動作し、私の意見ではかなりエレガントです。さらに2つのヒント:(1) "input"パラメータを 'Class input'と宣言すると、戻り値のキャストを防ぐことができます。 (2) 'ConstructorUtils.invokeConstructor(Class cls、Object ... args)'は、コンストラクタの取得と新しいインスタンスの作成を組み合わせたものです。 –

3

いいえ、あなたのための検索方法は、正確なパラメータを期待しています。したがって、リフレクションAPIの検索/検索メソッドを使用してコンストラクタ、メソッド、フィールドを探す場合、APIはequals()を使用して一致するものを見つけます。

Javaコンパイラが使用するのと同じロジックが必要な場合は、FEST Reflectまたはcommons beanutilsのようなフレームワークを使用する必要があります。または、getConstructors()に電話して、独自のフィルターコードを書く必要があります。

一見、これは愚かなようです:Javaコンパイラがそれを行うことができれば、なぜReflection APIを使用できないのですか? 2つの理由があります。まず、Javaランタイムは、コンパイラがすでに正しいメソッドを選択したために呼び出すメソッドを検索する必要がありません。

第2の理由は、Reflection APIが常に「第2位」であったことです。それはすべてを行うことができますが、使用するのは簡単ではありませんでした(少なくとも、それは私が使用するたびに思っています:-)

0

、または、それが

Class.getConstructor() 
を通じて返されることはありません

`B.class.getConstructorsを()`の使用についての代わり

Class.getDeclaredConstructor()