将类名作为参数传递

111*_*001 15 java

我有3类调用RedAlert,YellowAlertBlueAlert.

在我的课堂上,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)

这是完全错误的.

  • @edwardsmatt这是我的答案的一部分,否则OP可能会错误地使用Object.class(或任何其他类)调用上一个示例中所示的方法 (2认同)