2011-09-21 77 views

回答

46

"Using java.lang.reflect"将回答你所有的问题。首先提取采用了Class.forName()Class对象,然后:

如果我想要实例,我用forName()检索到的一类,我必须先问一下它代表我想构造一个java.lang.reflect.Constructor对象,然后问Constructor作出新的对象。 Class中的方法getConstructor(Class[] parameterTypes)将检索Constructor;然后我就可以使用Constructor通过调用其方法newInstance(Object[] parameters)

Class myClass = Class.forName("MyClass"); 

Class[] types = {Double.TYPE, this.getClass()}; 
Constructor constructor = myClass.getConstructor(types); 

Object[] parameters = {new Double(0), this}; 
Object instanceOfMyClass = constructor.newInstance(parameters); 

有一个newInstance()方法上Class可能似乎做你想要什么。 请勿使用。它静静地将检查到的异常转换为未经检查的异常。

请注意,此方法传播由nullary构造函数抛出的任何异常,包括检查的异常。使用此方法可以有效绕过编译时异常检查,否则编译器会执行该异常。 Constructor.newInstance方法通过将构造函数抛出的任何异常包装在(checked)InvocationTargetException中来避免此问题。

+13

自java 1.5以来,[constructor.newInstance()](http://download.oracle.com/javase/1,5,0/docs/api/java/lang/reflect/Constructor.html#newInstance(java.lang .Object ...))是可变参数,所以'构造函数。newInstance(new Double(0),this);'会做(而不是使用繁琐的Object []'方式)。 'Class.getConstructor()'同样适用(不需要难看的Class []) – Bohemian

+2

@Bohemian,很好。 –

+0

如果该课程是静态的,该怎么办?你不需要构造函数吗? – anon58192932

7

您可以使用reflection。例如,

Object o = Class.forName(className).newInstance(); 

但是className应该包含类的完整路径。

+5

请勿使用'Class.newInstance'。 [javadoc](http://download.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance())明确指出“使用此方法可以有效绕过编译时异常检查否则将由编译器执行;'Constructor.newInstance'方法通过将构造函数抛出的任何异常包装在(checked)InvocationTargetException中来避免此问题。 –

+0

谢谢!我不知道这个。 – Ilmirus

+0

@limirus,是的。它被埋在javadoc的深处。 –

相关问题