2017-03-11 7 views
-2

私は契約者のコードを扱っています。どんな理由であれ、彼はすべてのインターフェースである一連の "定数"ファイルを作っています。これらは次のようになります。Javaリフレクションを使用してインタフェースを直接インスタンス化することはできますか?

interface SomeTypeConsts { 
    public static class SomeSubTypeA { 
     public static final String CONSTANT_A = "foo"; 
     public static final String CONSTANT_B = "bar"; 
    } 
    public static class SomeSubTypeB { 
     public static final String CONSTANT_A = "baz"; 
    } 
} 

などです。未実装/抽象メソッドはありません。ファイルには、任意のレベルの深さのネストされたクラスと、定数の最終的な静的な文字列が含まれています。現時点では、契約者のコードを変更することはできません。

私はテストフレームワークを書いており、インスタンスがこれらの定数インタフェースの1つを必要としています。それらのすべてが上記のパターンに従いますが、私の方法は特定のものだけでなく、それらのすべてをサポートする必要があります。

私はこのようなリフレクションを使用して、インターフェイスをインスタンス化しようとした:

clazz.newInstance() // where clazz is Class<SomeTypeConsts> 

しかし、それはjava.lang.InstantiationExceptionを投げました。

ここで言うすべての質問は、まずインターフェイスを実装してからそのインスタンスを使用する必要があると言います。私が先にconstインターフェースを知っていれば、簡単にSomeTypeConsts consts = new SomeTypeConsts(){};を実行できました。しかし、私は反射とこれを行う方法を把握することはできませんでした。私が仕事をしなければならないのはClass<SomeTypeConst>です。

インタフェースのクラス参照で、上書きする/実装する抽象メソッドがない場合、リフレクションを使用してそのインスタンスをインスタンス化するにはどうすればよいですか?

+1

"Constant Interface Antipattern"を調べます。あなたの請負業者は良いプログラマーではありません。 –

+0

ええ、私は知っています。私の請負業者はばかだが、私はそれについての情報はない。 –

+2

これらのインターフェイスのインスタンスは必要ありません。100%無意味です。これらは静的なので、コンパイル時に解決されます。 'SomeTypeConsts.SomeSubTypeA.CONSTANT_A'を書くことができます。 – chrylis

答えて

2
the language spec

(強調鉱山)から:

このタイプには、インスタンス変数を持っていない、そして典型的には1つ以上の抽象メソッドを宣言する。そうでなければ無関係のクラスは抽象メソッドの実装を提供することでインタフェースを実装できます。 インターフェイスを直接インスタンス化することはできません。

そして、the Javadoc of Class.newInstance()から:

InstantiationException [スロー] - このクラスが抽象クラス、インタフェース、配列クラス、プリミティブ型、またはvoidを表す場合を。クラスがnullaryコンストラクタを持たない場合インスタンス化が何らかの理由で失敗した場合

インターフェイスをインスタンス化することはできません。それを実装する(抽象ではない)クラスのみをインスタンス化することができます。

0

いいえ、できません。定義によるインタフェースはインスタンス化できません。

+0

反射しても?あなたは、あなたがそうでなければ "リフレクションをすることを許可されていない"というたくさんのことをすることができます。 –

+0

私はあなたの質問を誤解しているという印象を受けていますか? –

+0

おそらく、@RoddyoftheFrozenPeas、あなたが誰かを達成することを望むものをあなたに教えてくれれば、それは実際にはうまくいく方法を提供することができます。 –

3

インターフェイスのJDKプロキシを使用してこれを行うことはできますが、それは全く意味がありません。静的メンバーにアクセスするだけであれば、問題のタイプの実際のインスタンスを参照することなくすべて解決されますコンパイル時(はるかに望ましい)または実行時にフィールドを列挙し、静的フィールドをフィルタリングするようなアプローチをとっています。

0

モックオブジェクトが必要です。反射ではない

関連する問題