1

私のプログラムには、インスタンス化できる一連のクラスがあります。各クラスには、そのクラスの特定の側面を更新する静的メソッドが関連付けられています。

実行時に、プログラムはセットからいくつかのクラスを使用することを選択します。

これらのクラスの複数のバージョンは、プログラムの実行時にオブジェクトとしてインスタンス化されます。

プログラム全体を通して、さまざまなクラスに関連付けられた静的メソッドを呼び出す必要がある重要なポイントがありますが、プログラムが実行時に選択した使用中のメソッドのみを呼び出します。

クラスをインスタンス化せずに、使用中のクラスを含むリスト/配列を作成することはできますか? 次に、そのリストを調べて、各クラスで静的メソッドを呼び出すことができますか?

私が見つけた他の唯一の方法は、使用中のクラスごとに 1 つのオブジェクトをインスタンス化し、それらを配列に格納して、そこからメソッドを呼び出すことです。これは少し非効率的で、あまりエレガントではないようです。

どんな助けでも大歓迎です。

4

3 に答える 3

4

リフレクションを使用して、次のようなことを行うことができます。

List <Class<?>> classes = new ArrayList<Class<?>>();

// alternatively, classes.add(com.foo.MyClass1.class);
classes.add(Class.forName("com.foo.MyClass1"));  
classes.add(Class.forName("com.foo.MyClass2"));
// ...etc

Method m = classes.get(0).getDeclaredMethod("staticFunction");
m.invoke(null); // pass in an instance of the class if this is an instance method

クラスメソッドのjavadocを確認してください。

于 2013-02-24T18:10:41.357 に答える
3

インスタンス化を避けたい理由はわかりませんが、静的メソッドを呼び出すだけの場合は、オブジェクトを作成する理由はありません。あなたの質問に関しては、問題なくクラスの配列を作成することができます。MyClass.classは実際にはクラスClassのオブジェクトであるため、これは機能することに注意してください。

Class[] classes = new Class[] {MyClass1.class, MyClass2.class};

次に、ロジックを使用してそれらのいくつかを選択できます。完了したら、リフレクションを使用してそれらをインスタンス化できます。

classes[0].newInstance();

お役に立てば幸いです。そうでない場合は、質問を正確に記入してください。クラスオブジェクト自体が作成されることに注意してください(クラスローダーがそれらをロードするのを防ぐことができるかどうかはわかりません)。

于 2013-02-24T18:09:53.030 に答える
1

次のようなクラスオブジェクトのリストを作成できます。

List<Class> myClasses = new ArrayList<Class>();

リストにアイテムを追加するには、次のようにコーディングしますmyClasses.add(Class1.class);

これは、各クラスのインスタンスを作成する必要なしに、クラスのリストを格納する1つの方法です。

于 2013-02-24T18:11:56.263 に答える