有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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反射,以下是我的两个问题:

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

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

感谢您的帮助


共 (2) 个答案

  1. # 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. # 2 楼答案

    是的,它会起作用的

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

    例如,假设您希望使用intString参数调用构造函数。下面是实现这一点的代码:

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