【发布时间】:2011-05-04 22:41:16
【问题描述】:
我一直在努力更好地理解 Java 的反射工具,现在我正在尝试使用用户在下拉框中选择的构造函数创建一个类的新实例。
//ask user what to name the new instance of chosen Class ( passed into this method )
String instanceName = JOptionPane.showInputDialog(null, "Under what name would you like to store this Instance?",
"Create an Instance of a Class", JOptionPane.QUESTION_MESSAGE);
Object chosenC = JOptionPane.showInputDialog(null, "Please choose a Constructor for" + chosenClass,
"Create an Instance of a Class", 3, null, getConstructors(chosenClass), JOptionPane.QUESTION_MESSAGE);
Constructor c = (Constructor)chosenC;
Class[] params = c.getParameterTypes(); //get the parameters of the chosen Constructor
try {
//create the instance with the correct constructor
instance = c.newInstance((Object[])params);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e){
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
现在,如果我选择除默认构造函数(无参数)以外的任何内容,我会收到 ArgumentTypeMismatch 异常。我是否遗漏了一些明显的东西?
感谢您的帮助。
编辑 谢谢大家的答案。
但是那我要如何要求参数呢?如果我得到 params 数组的长度,那么我必须确定每个索引是什么类型的类,并要求用户以正确的形式输入一个值?那么我如何将这个新数组传递给 newInstance 参数呢?
【问题讨论】:
-
通常这种动态对象创建最好使用具有默认构造函数的类来完成。这样你就可以创建一个对象,然后通过设置器等设置你想要的任何参数。在这种情况下,需要循环所有
params并为每个类创建clazz.newInstance(...)... 这可能是美好的无限深渊 -
我明白了。谢谢哈。这是有道理的。
-
@Frank71 - 这是面向开发人员的应用程序,还是您有最终用户?如果是后者,我不会将其留给反射 API 来确定行为,而是会在代码中从下拉框中指定每个选项的构造函数/行为。
标签: java reflection