我有3类调用RedAlert,YellowAlert和BlueAlert.
在我的课堂上,AlertController我希望有一个像这样的方法:
public void SetAlert(//TAKE IN NAME OF CLASS HERE//)
{
CLASSNAME anInstance = new CLASSNAME();
}
Run Code Online (Sandbox Code Playgroud)
所以例如我想:
AlertController aController = new AlertController();
SetAlert(RedAlert);
Run Code Online (Sandbox Code Playgroud)
如何将类名作为参数,并根据该类名从类名创建适当的对象?
San*_*oel 21
使用反射是可能的.这里是给定的className(作为字符串传递).将在内存中搜索此类(它应该已经加载).作为字符串传递时要实例化的类的名称应该是完全限定的
void createInstanceOfClass(String className) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class classTemp = Class.forName(className);
Object obj =classTemp.newInstance();
}
}
Run Code Online (Sandbox Code Playgroud)
Lui*_*oza 18
您可以传递类本身并使用反射来创建类的新实例,而不是传递类名.这是一个基本的例子(假设你的所有XxxAlert类都从一个类扩展Alert):
public <T extends Alert> void setAlert(Class<T> clazzAlert) {
Alert alert = clazzAlert.newInstance();
//use the alert object as you want/need...
}
Run Code Online (Sandbox Code Playgroud)
现在你只需调用这样的方法:
setAlert(RedAlert.class);
Run Code Online (Sandbox Code Playgroud)
请注意,在T参数中使用超类会更好,否则您(或其他程序员)可以这样做:
setAlert(Object.class);
Run Code Online (Sandbox Code Playgroud)
这是完全错误的.