3

私はリフレクションが初めてです。いくつかの質問とチュートリアルを見てきました。

3つのクラスA、B、Cによって実装された1つのインターフェースがあると仮定しましょう

public interface MyInterface {
doJob();

}

リフレクションを使用して、各クラスを呼び出したい

Class<?> processor = Class.forName("com.foo.A");
Object myclass = processor.newInstance();

オブジェクトを作成するのではなく、プロセス全体を特定のタイプに制限できませんか。MyInterface型のクラスだけを呼び出したい。

com.foo.A を渡すと、A クラス オブジェクトを作成する必要があり、com.foo.B は B クラス オブジェクトを作成する必要があります。 .

どうすればこれを達成できますか?

4

3 に答える 3

6

試す

MyInterface newInstance(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
    Class<?> cls = Class.forName(className);
    if (!MyInterface.class.isAssignableFrom(cls)) {
        throw new IllegalArgumentException();
    }
    return (MyInterface) cls.newInstance();
}
于 2013-02-04T05:45:42.377 に答える
2

まあ、Java リフレクションは汎用的な仕組みなので、質問で提示したコードだけを使っていては、あなたが達成したいことを達成する方法はありません。「MyInterface」を実装するタイプ以外のタイプの作成オブジェクトのJavaを制限する方法を尋ねるのとまったく同じです。Java の「new」は汎用であり、必要なオブジェクトを作成できます。

一般に、これには独自のコードを記述できます。そして、直接電話する代わりに

Class.forName

独自のコードを呼び出す

コンパイル時/実行時にそのようなものを実装できます。

コンパイル タイプ チェックの例 (クラス オブジェクトを作成する必要があります):

public T newInstance(Class<T extends MyInterface cl) {
  return cl.newInstance();
}  

ランタイムの例は、すでに Evgeniy Dorofeev によって投稿されています

お役に立てれば

于 2013-02-04T05:47:42.383 に答える
0

以下のコードを試してください

 package com.rais.test;

public class Client {

    public static void main(String[] args) {
        try {
            System.out.println(createObject("com.rais.test.A"));
            System.out.println(createObject("com.rais.test.D"));

        } catch (Exception e) {
            e.printStackTrace();
        }
}

public static MyInterface createObject(String className)
        throws ClassNotFoundException, InstantiationException,
        IllegalAccessException {

    Class<?> clazz = Class.forName(className);

    if (MyInterface.class.isAssignableFrom(clazz)) {
        return (MyInterface) clazz.newInstance();

    } else {

        throw new RuntimeException(
                "Invalid class: class should be child of MyInterface");
    }

}
于 2013-02-04T06:02:30.553 に答える