gpt4 book ai didi

java - 使用反射在运行时调用带有指定参数的构造函数 [Java]

转载 作者:行者123 更新时间:2023-12-02 06:06:03 24 4
gpt4 key购买 nike

我正在开发这个程序,它以“new id class arg0 arg1 …”的形式接受用户的输入(例如 new obj1 String int:5 bool:true …)。解析此命令后,我需要创建指定类的新实例并使用“指定参数”调用其构造函数。现在这是我一直陷入的部分,因为我看到的所有示例都类似于 constructor.newInstance(String.class, bool.class) 但在我的情况下,我以字符串形式获取参数,并且我困惑于如何将它们转换为上述形式并调用特定的构造函数。参数数量也不清楚,那么有什么简单的方法可以解决我的问题吗? (创建给定类的实例并使用指定数量的参数调用构造函数)我需要执行的示例命令和操作是:

new x java.util.ArrayList int:5 --> x refers to “new ArrayList(5)”

最佳答案

成功解析字符串后,您可以使用 Class.getConstructor()Class.getDeclaredConstructor() 来获取所需的构造函数。对于您的情况,这两种方法之间的主要区别在于 Class.getDeclaredConstructor() 还允许您调用私有(private)构造函数(源代码中声明的任何内容,因此得名)。这是您的测试用例的示例:

int argListLength = 1; // This should really be the number of parsed arguments
Class[] argumentTypes = new Class[argListLength];
Object[] argumentValues = new Object[argListLength];

// In reality you will want to do the following statement in a loop
// based on the parsed types
argumentTypes[0] = Integer.TYPE;

// In reality you will want to do the following statement in a loop
// based on the parsed values
argumentValues[0] = 5;

Constructor<ArrayList> constructor = null;
try {
consrtuctor = java.util.ArrayList.class.getConstructor(argumentTypes);
} catch(NoSuchMethodException ex) {
System.err.println("Unable to find selected constructor..."); // Display an error
// return or continue would be nice here
}

ArrayList x = null;
try {
x = constructor.newInstance(argumentValues);
} catch(InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
System.err.println("Unable to call selected constructor..."); // Display an error
// return or continue would be nice here
}

您可能会注意到,调用构造函数时可能会出现很多错误。唯一特殊的是 InitationTargetException,它包装了成功调用的构造函数引发的异常。

关于java - 使用反射在运行时调用带有指定参数的构造函数 [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22285606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com