我有一个抽象类"A",类"B"one_answers"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()。
感谢任何帮助,
是的,它会起作用。
如果您想使用默认(无参数)构造函数以外的构造函数,请继续阅读。
举个例子,您想用int
和String
参数调用构造函数。以下是可以做到这一点的代码:
Class<?> clazz = Class.forName("org.source."+ token );
Constructor<?> constructor = clazz.getConstructor(int.class, String.class);
Object object = constructor.newInstance(1, "hello");
只有当你想调用无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/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object…)
请参阅Reflection教程,以获取有关上述用法的示例:
http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
了解更多信息。