为给定的参数调用适当的构造函数

时间:2017-09-29 18:58:18

标签: java reflection constructor

假设String数组中给出的参数是:

String [] args = {“ABC”,“5”,“4.4”,“true”};

现在我想通过调用方法class.getConstructor(args)来调用分别获取String,integer,double和Boolean的构造函数。

我正在尝试解析用户在命令行上传递给我的程序的参数,并希望相应地配置我的类。

我将如何做到这一点?

2 个答案:

答案 0 :(得分:2)

像#" 5"可以表示Stringintegerdouble,从args数组前进到匹配构造函数是不可能的。正如@Sotirios评论的那样,你必须查看类的所有构造函数,尝试用适当的函数解析args元素,如果成功,那么构造函数是适用的。

然后调用构造函数将是该项目中最简单的部分。

答案 1 :(得分:1)

您提到的方法getConstructor(Class<?>... parameterTypes)属于Reflection Framework。虽然反思确实有其优点,有时是解决问题的唯一方法,但你应该避免它,除非你有充分的理由。

使用反射使代码正确是困难和乏味的,因为编译器无法检测到大多数错误。 一般用途只是a code smell

初始化类的常用方法是直接调用相应的构造函数,如@Ralf Kleberhoff所述:MyClass instance = new MyClass(stringParam, intParam, doubleParam, booleanParam);

如果大多数参数是可选的,通常只将所需的参数传递给构造函数。这避免了大量不同的构造函数(待测试和记录)。构造函数通常将可选参数设置为合理的默认值。然后使用 setters 设置这些可选参数(如果可用)。

由于你没有真正描述,你想要实现的目标(而不是你当前的问题),我们只能猜测......

我的猜测是,您尝试解析参数,用户会在命令行上传递给您的程序,并希望配置您的课程相应

我对此的回答就是:不要写那段代码!那里有many good libraries。这些测试并提供许多好东西和示例。如果你坚持重新发明轮子,这是一个很好的起点,看看如何做到这一点。