Cアクセスできることがわかっているインターフェイスを介してクラスにアクセスするだけでよい場合は、次のように簡単です。
MyInterface provider=null;
try{
Class myClass= Class.forName("sysPackage.C");
provider = (MyInterface)(myClass.newInstance());
}catch(Exception ex){
}
if(provide!=null){
//Use provider
}
C使用できるインターフェイスがない場合はS、代わりにインターフェイスのメンバーになるラッパー クラスを作成できます。
class S implements MyInterface{
static {
try {
Class.forName("sysPackage.C");
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public static void forceExceptionIfUnavailable() {}
//TODO: Methods that use C. Class C will only be used within this class
}
Sが利用できない場合、クラスの解決中に例外がスローされるように、静的ブロックがありますC。クラスをロードした直後にforceExceptionIfUnavailable、静的ブロックがすぐに実行されることを確認するために呼び出します。クラッシュしない場合は、のメソッドを使用しSて間接的に class を使用できますC。
または、ここでメソッドを使用できます。
基本的に、新しいパッケージを作成Pし、パブリック抽象クラスと、パッケージに対してプライベートAな具象サブクラスを作成します。インスタンス化中に例外がスローされた場合に、またはのインスタンスを返す静的メソッドがあります。の各インスタンスには のインスタンスがあるため、 が利用できない場合はインスタンス化に失敗しますが、それ以外の場合は成功します。この方法は(したがってすべてのAPI が) パッケージ プライベートであるため、少し安全なようです。SAgetSSnullSCCSC