2012-02-09 73 views
0

我有一个抽象类'A'和类'B'和'C'扩展A. 我想基于某些变量在运行时创建这些实例。类似下面:Java反射

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反射,这里是我的2个问题:

  1. 正是我在右上方做的(编辑:如果是默认的构造函数)? (我假设是)

  2. 上述工作如果调用默认构造函数(不带参数)。我将如何处理一个我有构造函数来接受争论的情况。我不是很确定我可以如何使用Constructor.newInstance()可以用于上述情况。

任何帮助表示赞赏,

+2

if(1),将无法在Java中工作。此外,类中的“newInstance”仅适用于0-arg构造函数。所以这种方法无法调用需要参数的构造函数。 – eternaln00b 2012-02-09 04:26:22

+0

你能解释一下你想达到的目标吗?反思往往不是这份工作的正确工具。 – Vadim 2012-02-09 04:32:59

回答

1

是的,它会工作。

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

比方说,例如,您想用intString参数调用构造函数。这里的代码将做到这一点:

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

你在做正确的前提是你要调用的无参数的构造函数,这真的是你可以在“的newInstance”的方法做的唯一事情就是类。请参阅:

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#newInstance()

调用与正参数的构造器,使用构造函数的类:

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

欲了解更多信息。