Java反射
我有一个抽象类“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;
}
}
我将使用以下代码调用方法count:
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反射,以下是我的两个问题:
我在上面所做的是否正确(编辑:在默认构造函数的情况下)?(我想是的)
如果调用默认构造函数(不带参数),则上述方法有效。我将如何处理一种情况,即我有接受参数的构造函数。我不太确定如何使用构造函数。newInstance()可用于上述情况
感谢您的帮助
# 1 楼答案
只有当您想调用no-arg构造函数时,您所做的才是正确的,这实际上是类中“newInstance”方法唯一可以做的事情。见:
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#newInstance()
要使用n-args调用构造函数,请使用构造函数类:
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object…)
有关上述用法的示例,请参见反射教程:
http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html
更多信息
# 2 楼答案
是的,它会起作用的
如果要使用默认(无参数)构造函数以外的构造函数,请继续阅读
例如,假设您希望使用
int
和String
参数调用构造函数。下面是实现这一点的代码: