【发布时间】:2011-09-21 07:03:11
【问题描述】:
我有一个字符串
String className = "DummyClass"
现在我想创建一个类名为 className 的类对象,类似于
Object className = new className() // I know it's not possible.
我想知道怎么做...
【问题讨论】:
标签: java jakarta-ee
我有一个字符串
String className = "DummyClass"
现在我想创建一个类名为 className 的类对象,类似于
Object className = new className() // I know it's not possible.
我想知道怎么做...
【问题讨论】:
标签: java jakarta-ee
"Using java.lang.reflect" 将回答您的所有问题。首先使用Class.forName()获取Class对象,然后:
如果我想实例化一个我用
forName()检索的类,我必须首先向它请求一个代表我想要的构造函数的java.lang.reflect.Constructor对象,然后请求Constructor创建一个新对象。Class中的方法getConstructor(Class[] parameterTypes)将检索到Constructor;然后我可以通过调用它的方法newInstance(Object[] parameters)来使用Constructor: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() 方法似乎可以满足您的要求。 不要使用它。它以静默方式将已检查的异常转换为未检查的异常。
请注意,此方法会传播由 nullary 构造函数引发的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译器执行的编译时异常检查。
Constructor.newInstance方法通过将构造函数抛出的任何异常包装在(已检查)InvocationTargetException中来避免此问题。
【讨论】:
constructor.newInstance(new Double(0), this); 可以(而不是使用繁琐的Object[] 方式)。 Class.getConstructor() 也是如此(不需要丑陋的 Class[])
static 类只是一个内部类,它没有对其包含类的实例的隐式引用。它仍然需要有一个构造函数。
Object returnValue = listMethod.invoke(null, argument0, argument1, argument2);。您将null 作为this 的值传入,因为静态方法不在类实例的上下文中运行。
invoke 方法是 variadic,因此您可以传递任意数量的参数。
您可以使用reflection。例如,
Object o = Class.forName(className).newInstance();
但className 应该包含类的完整路径。
【讨论】:
Class.newInstance。 javadoc 明确表示“使用此方法有效地绕过编译时异常检查,否则编译器将执行该检查。Constructor.newInstance 方法通过将构造函数抛出的任何异常包装在(已检查)@ 中来避免此问题。 987654327@。”
查看此问题的答案:What is the difference between "Class.forName()" and "Class.forName().newInstance()"?,其中详细解释了这一切的工作原理。
【讨论】: