在public static void main(String args[])
的args[]
中,我想指定要实现的子类。如何将args[]
(a String
)的参数转换为类声明?
例如,如果args[0]
= "Subclass1"
,那么我需要在下面声明:BaseClass b = new Subclass1()
这在Java中可能吗?
编辑
为了使这一步更加复杂,这些子类来自外部.jar
。是否有任何方法可以动态导入子类,或者它们需要事先导入?
类名应该是类的完整路径,即[package]。[classname]您可以使用Class.forName([class name]).newInstance();
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
。
如果您的主类名为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
来代替一般的对象。