これは、クラス名を使用してインスタンスを作成する方法です。の具象型にAlert
は、引数を取らないパブリック コンストラクターが必要です。
private Alert alert;
public void setAlert(String className)
{
try {
Class<?> raw = Class.forName(className);
Class<? extends Alert> type = raw.asSubclass(Alert.class);
Constructor<? extends Alert> ctor = type.getConstructor();
this.alert = ctor.newInstance();
} catch (Exception ex) {
throw new IllegalArgumentException("Invalid Alert implementation.", ex);
}
}
呼び出し元は次のように使用します。
AlertController aController = new AlertController();
controller.setAlert("com.y.foo.RedAlert");
特定のパラメーターのセットをコンストラクターに渡すための規則を作成する場合は、それを行うこともできますが、getConstructor()
それを見つけるために呼び出しで少し余分な作業を行う必要があります。公開されていないコンストラクターを使用することもできますが、これも少し余分な作業が必要です。
クラス リテラルを渡すという提案はRedAlert.class
あまり意味がありません。RedAlert
コンパイル時に呼び出し元がクラスを使用できる場合は、そのコンストラクターを使用するだけnew RedAlert()
です。