在args[]
的{{1}}中,我想指定要实现的子类。如何将public static void main(String args[])
(a args[]
)的参数转换为类声明?
例如,如果String
= args[0]
,那么我需要在以下某处声明:
"Subclass1"
这可以用Java吗?
修改
为了使这一步更加棘手,这些子类来自外部BaseClass b = new Subclass1()
。有没有办法动态导入子类,还是需要事先导入它们?
答案 0 :(得分:8)
类名应该是类的完整路径,即[package]。[classname]
您可以使用Class.forName([class name]).newInstance();
答案 1 :(得分: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
。
答案 2 :(得分: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>
和MyInterface instance
代替常规对象。