这是使用类名创建实例的方法。的具体类型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()
.