Java思考

时间:2012-02-09 04:24:12

标签: java reflection

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

  1. 我上面做的是正确的(编辑:在默认构造函数的情况下)? (我假设是的)

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

  3. 任何帮助表示赞赏,

2 个答案:

答案 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/7/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang.Object ...)

有关上述用法的示例,请参阅反思教程:

http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html

了解更多信息。

答案 1 :(得分:1)

是的,它会起作用。

如果你想使用默认(no-args)之外的构造函数,请继续阅读。

例如,假设您要使用intString参数调用构造函数。这是代码:

Class<?> clazz = Class.forName("org.source."+ token );
Constructor<?> constructor = clazz.getConstructor(int.class, String.class);
Object object = constructor.newInstance(1, "hello");