3

我想指定要实现哪个子类args[]public static void main(String args[])如何将args[](a String) 的参数转换为类声明?

例如,如果args[0]= "Subclass1",那么我需要在下面的某个地方声明:
BaseClass b = new Subclass1()

Java可以做到这一点吗?

编辑
为了使这一步更棘手,这些子类来自外部.jar. 有什么方法可以动态导入子类,还是需要事先导入?

4

3 回答 3

8

类名应该是类的完整路径,即 [package].[classname] 你可以使用Class.forName([class name]).newInstance();

于 2013-03-01T15:58:00.330 回答
6
public static void main(String[] args) {
    if (args.length > 0) {
        // exceptions handling omitted
        Class<?> clazz = Class.forName(args[0]);
        // check before casting
        if (BaseClass.class.isAssignableFrom(clazz)) {
            BaseClass instance = (BaseClass) clazz.newInstance();
            // use
        }
    }
}

请注意,它className应该是类的完整路径,即不仅是Subclass1,而是your.package.Subclass1

于 2013-03-01T15:59:01.360 回答
2

如果你的主类被调用com.acme.app.Main,并且它有一个子类public static class Subclass1,那么使用这个代码片段:

Class<?> cls = Class.forName("com.acme.app.Main$"+args[0]);
Object instance = cls.getConstructor().newInstance();

通过$标记访问内部类。

请注意,cls.getConstructor().newInstance()比旧的更推荐cls.newInstance()

如果您知道您的内部类实现或扩展了某个接口或类,那么您可以使用Class<MyInterface>andMyInterface instance来代替通用对象。

于 2013-03-01T16:01:25.023 回答