Java如何从字符串实例化一个类
可能重复:
从Java中的Variable创建新类
我有一个字符串
String className = "DummyClass"
现在我想创建一个类对象,其中类名是className ,就像这样
Object className = new className() // I know it's not possible.
我想知道怎么做…
“使用java.lang.reflect
”将回答您的所有问题。 首先使用Class.forName()
获取Class
对象,然后:
如果我想实例化一个用
forName()
检索的类,我必须首先向它询问一个表示我想要的构造函数的java.lang.reflect.Constructor
对象,然后让它Constructor
一个新的对象。getConstructor(Class[] parameterTypes)
的方法getConstructor(Class[] parameterTypes)
将检索一个Constructor
; 然后,我可以通过调用其方法newInstance(Object[] parameters)
来使用该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);
在Class
上有一个newInstance()
方法,它似乎可以做你想要的。 不要使用它 。 它以静默方式将已检查的exception转换为未经检查的exception。
请注意,此方法传播由Nullary构造函数抛出的任何exception,包括已检查的exception。 使用此方法可以有效地绕过编译时exception检查,否则将由编译器执行。
Constructor.newInstance
方法通过在(已检查的)InvocationTargetException
包装构造函数抛出的任何exception来避免此问题。
你可以使用reflection
。 例如,
Object o = Class.forName(className).newInstance();
但className
应包含该类的完整路径。
检查这个问题的答案: “Class.forName()”和“Class.forName()。newInstance()”有什么区别? 这详细解释了所有这些是如何工作的。