( を使用して) オブジェクトの新しいインスタンスを作成し、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);
}
}