我有一个抽象类'A'和类'B'和'C'扩展A. 我想基于某个变量在运行时创建这些实例。如下所示:
public abstract class A {
public abstract int count();
}
public class B extends A {
public int count () {
//print 10;
}
}
public class C extends A {
public int count () {
//print 20;
}
}
我会使用下面的代码来调用方法计数:
String token;
int i = 10;
if (i == 10) //edit
token = "B";
else
token = "C";
A a;
try {
a = (A) (Class.forName("org.source."+token)).newInstance();
} catch (Exception e) {
//print e
}
a.count();
由于我是java反思的新手,以下是我的两个问题:
我上面做的是正确的(编辑:在默认构造函数的情况下)? (我假设是的)
如果调用默认构造函数(不带参数),则上述方法有效。我如何处理我有构造函数接受参数的情况。我不太确定如何使用Constructor.newInstance()可用于上述情况。
任何帮助表示赞赏,
答案 0 :(得分:1)
只有当你想调用no-arg构造函数时,你所做的才是正确的,这实际上是你在Class中使用“newInstance”方法唯一能做的事情。参见:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#newInstance()
使用n-args调用构造函数,使用Constructor类:
有关上述用法的示例,请参阅反思教程:
http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
了解更多信息。
答案 1 :(得分:1)
是的,它会起作用。
如果你想使用默认(no-args)之外的构造函数,请继续阅读。
例如,假设您要使用int
和String
参数调用构造函数。这是代码:
Class<?> clazz = Class.forName("org.source."+ token );
Constructor<?> constructor = clazz.getConstructor(int.class, String.class);
Object object = constructor.newInstance(1, "hello");