Java Reflections



我有一个抽象类"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反射的新手,下面是我的两个问题:

  1. 我正在做的是正确的吗(编辑:在默认构造函数的情况下)?(我推测是的)

  2. 如果调用了默认构造函数(不带参数),则上述方法有效。如果构造函数接受了参数,我该如何处理这种情况。我不太确定如何使用Constructor。在上述情况下可以使用newInstance()。

感谢任何帮助,

是的,它会起作用。

如果您想使用默认(无参数)构造函数以外的构造函数,请继续阅读。

举个例子,您想用intString参数调用构造函数。以下是可以做到这一点的代码:

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

了解更多信息。

相关内容

  • 没有找到相关文章

最新更新