5
interface Bank {
    void connect();
}

class SBI implements Bank {
    static{
        System.out.println("Hello from SBI static");
    }   
    public void connect() {
        System.out.println("Connected to SBI");
    }
}

class LooseCouplingTest {
    public static void main(String... args)throws Exception {
        String className = args[0];
        Class.forName(className);
    }
}

上記のコードの出力は次のように見えます
Hello from SBI static

alsoステートメントを出力するには、コードと Y に何を追加する必要がありますか
Connected to SBI

詳細な説明は大歓迎です

PS Noobはこちら

4

2 に答える 2

4

( を使用して) オブジェクトの新しいインスタンスを作成し、Class#newInstance()(シナリオで) 必要な型にキャストしてからSBI呼び出す必要があります。

作業コード:

public class LooseCouplingTest {
    public static void main(String... args)throws Exception {
        String className = args[0];
        Class<?> clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        SBI mySBI = (SBI) obj;
        mySBI.connect();
    }
}

説明:

  • Class.forName("pkg.SBI")pkg.SBIオブジェクト内のクラスへの参照を取得しclazzます。
  • clazzが への参照を保持しているように、SBI呼び出しclazz.newInstance();は呼び出しと同じです: new SBI();
  • を呼び出しclazz.newInstance();た後、変数はインスタンスobjを受け取りSBIます。
  • SBIメソッドを呼び出したい場合、そのobj型はObject(newInstance()メソッドの戻り値の型です) にキャストしてからSBI呼び出す必要がありますconnect()

Java のリフレクション API を使用する:

さらに進んでキャストを実行したくない場合 (この方法でLooseCouplingTestは import は必要ありませんSBI)、Java の Reflection APIを使用してメソッドを呼び出すことができますconnect()

そのための作業コードは次のとおりです。

public class LooseCouplingTest {
    public static void main(String... args) throws Exception {
        String className = args[0];
        Class<?> clazz = Class.forName(className);
        Object obj = clazz.newInstance();
        java.lang.reflect.Method connect = clazz.getMethod("connect");
        connect.invoke(obj);
    }
}
于 2013-04-14T06:07:32.733 に答える
1

Class.forName()クラスをロードします。クラスのロードの一部は、静的初期化ブロックを実行しています。「Hello from SBI static」が表示されるのはそのためです (このstatic { ... }部分は静的初期化ブロックです)。

「Connected to SBI」を表示するには、クラスのインスタンスを作成し、そのconnect()メソッドを呼び出す必要があります。

Class<? extends Bank> bankClass = (Class<? extends Bank>)Class.forName(className);
Bank bank = bankClass.newInstance();
bank.connect();
于 2013-04-14T06:08:42.863 に答える