6

多くのクラスの新しいインスタンスを作成する必要があります。リフレクションを使用していますが、c.newInstance()を作成すると、「空のパラメーターコンストラクター」のないクラスがjava.lang.InstantiationExceptionをスローします。

さて、どうすればすべてのクラスのインスタンスを作成できますか?

c.getConstructor(Class).newinstance(params)を使用して、「空のパラメーターコンストラクター」を持たないクラスのインスタンスを作成できることは知っていますが、各クラスのパラメーターはわかりません。

もう1つ、これらのクラスはすべてParentClassと呼ばれる別のクラスから拡張されているため、使用できる回避策の1つは、子クラスに「空のパラメーターコンストラクター」を実装するように強制するコードをParentClassに含めることですが、その方法がわかりません。これを行う。

前もって感謝します !

4

3 に答える 3

11

Class.getConstructors()を呼び出して、特定のクラスのすべてのコンストラクターを取得できます。

Constructorで、 Constructor.getGenericParameterTypes()を呼び出して、期待されるパラメーターを知ることができます。

于 2012-12-07T19:49:06.517 に答える
3

できません。パラメーターなしのコンストラクターを「要求」してコンパイラーによって強制する方法はありません。定義により、クラスのインスタンスを作成するには、必要なパラメーターを提供する必要があります。クラス コントラクト (適切に初期化されていないため)。

これをコード レベルで強制する適切な方法は、オブジェクト ファクトリとインターフェイスを使用することです。コンパイル時の型がわからないため、リフレクションを使用する必要があると思います。この場合、各タイプのインスタンスを生成する方法を知っている「Factory」も必要です。このファクトリは、適切なコンストラクタを認識して呼び出すことができるように、問題の型でビルド/コンパイルする必要があります。その後、ファクトリは、オブジェクトのインスタンス化のためにファクトリに委譲できるようにする「ObjectFactory」など、コードが認識しているインターフェイスを実装します。次に、オブジェクトファクトリがインスタンス化できる型を担当するものとして登録するために使用できるメソッドを用意します。

作成しようとしているクラスに同梱されているコードでは:

static {
    FactoryRegistry.register(TypeA.class, new TypeAFactory());
}

そしてあなたのコードで:

Class<?> unknownClass = ...;
Object obj = FactoryRegistry.getFactory(unknownClass).newInstance();

(メソッドを実装および指定するFactoryインターフェースがある場合)TypeAFactorynewInstance

それが何であるか、またはインスタンス化する方法はわかりませんunknownClassが、そのクラスに付属のコードがファクトリを登録している場合は、そのファクトリを照会して、オブジェクトを作成するように依頼できます。unknownClassが本当にの場合TypeA.class、レジストリはTypeAFactoryオブジェクトを作成するために登録された を返します。


または、フレームワークがロードしているコードの作成者に、引数のないコンストラクターを動的に含めるよう要求することもできます。厳密に強制されているわけではありませんが、作成者が実装しやすい場合があります。

于 2012-12-07T19:49:19.820 に答える
2

クラスのインスタンスを作成するための 2 つのリフレクション メソッドがあります。java.lang.reflect.Constructor.newInstance()Class.newInstance()

Class.newInstance() は、引数なしのコンストラクタのみを呼び出すことができますが

Constructor.newInstance() は、パラメーターの数に関係なく、任意のコンストラクターを呼び出すことができます

于 2012-12-07T19:54:30.730 に答える