可能重复:
Create new class from a Variable in Java的Java如何从字符串实例化一个类
我有一个字符串
String className = "DummyClass"
现在我想创建一个类的对象,其中班级名称是className这就像
Object className = new className() // I know it's not possible.
我想知道如何做到这一点...
可能重复:
Create new class from a Variable in Java的Java如何从字符串实例化一个类
我有一个字符串
String className = "DummyClass"
现在我想创建一个类的对象,其中班级名称是className这就像
Object className = new className() // I know it's not possible.
我想知道如何做到这一点...
"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
中来避免此问题。
您可以使用reflection
。例如,
Object o = Class.forName(className).newInstance();
但是className
应该包含类的完整路径。
请勿使用'Class.newInstance'。 [javadoc](http://download.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance())明确指出“使用此方法可以有效绕过编译时异常检查否则将由编译器执行;'Constructor.newInstance'方法通过将构造函数抛出的任何异常包装在(checked)InvocationTargetException中来避免此问题。 –
谢谢!我不知道这个。 – Ilmirus
@limirus,是的。它被埋在javadoc的深处。 –
检查这个问题的答案:What is the difference between "Class.forName()" and "Class.forName().newInstance()"?它详细解释了所有这些工作。
自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
@Bohemian,很好。 –
如果该课程是静态的,该怎么办?你不需要构造函数吗? – anon58192932