私は契約者のコードを扱っています。どんな理由であれ、彼はすべてのインターフェースである一連の "定数"ファイルを作っています。これらは次のようになります。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>
です。
インタフェースのクラス参照で、上書きする/実装する抽象メソッドがない場合、リフレクションを使用してそのインスタンスをインスタンス化するにはどうすればよいですか?
"Constant Interface Antipattern"を調べます。あなたの請負業者は良いプログラマーではありません。 –
ええ、私は知っています。私の請負業者はばかだが、私はそれについての情報はない。 –
これらのインターフェイスのインスタンスは必要ありません。100%無意味です。これらは静的なので、コンパイル時に解決されます。 'SomeTypeConsts.SomeSubTypeA.CONSTANT_A'を書くことができます。 – chrylis