众所周知,Java反射提供Class.getConstructors
方法,但Constructor<?>[]
数组的顺序如何?
例如,我创建了Person类,并且有3个构造方法:
public Person()
{
}
public Person(int age)
{
this.age = age;
}
public Person(int age, String name)
{
this.age = age;
this.name = name;
}
通过调试,我找到了构造函数数组的顺序,如下所示:
0 = public xxx.Person(int)
1 = public xxx.Person(int, java.lang.String)
2 = public xxx.Person()
答案 0 :(得分:3)
当我看到Class#getDeclaredConstructors()-method时,我注意到以下一行:
“返回的数组中的元素没有排序,也没有任何特定的顺序。”
在Class#getConstructors()-method,虽然没有提及...... 即使没有提到,我的假设是同样适用于你的代码所证明的那种方法。
我不确定你想要完成什么(也许你可以为你的问题添加目标,以便我们可以帮助你更进一步),但我认为不可能让构造函数处于相同的顺序使用反射。
编辑:在您的示例中使用构造函数,您可以像这样调用三个中的任何一个:
Class<Person> pClass = Person.class;
pClass.getDeclaredConstructor().newInstance(); // default constructor
pClass.getDeclaredConstructor(int.class).newInstance(50); // constructor with int parameter
pClass.getDeclaredConstructor(int.class, String.class).newInstance(50, "test"); // constructor with int and String parameters
答案 1 :(得分:1)
由于构造函数顺序对java类无关紧要,因此没有getConstructors方法顺序的规范。我认为测试你可以找出默认顺序,但我不会使用它,因为可以随时更改。如果您想获取特定构造函数检查参数,或者订单是否重要,则将.java文件作为简单文本文件处理。
返回一个包含反映所有的Constructor对象的数组 此Class对象表示的类的公共构造函数。一个 如果类没有公共构造函数,则返回长度为0的数组, 或者如果类是数组类,或者类是否反映了 原始类型或无效。请注意,此方法返回一个数组 构造函数对象(这是一个构造函数数组) class),这个方法的返回类型是Constructor []而不是 可能是预期的构造函数[]。这个信息量较少的回报 类型是必要的,因为从这个方法返回后, 可以修改数组以保存不同的Constructor对象 类,这将违反Constructor []的类型保证。 返回:
答案 2 :(得分:0)
Class
类有几种类似的方法,例如getInterfaces
,getTypeParametrers
,getMethods
,getFields
等。
在大多数情况下,当订单定义明确时,会在javadoc中指定。例如,getInterfaces
:
数组中接口对象的顺序对应于此对象所表示的类声明的implements子句中接口名称的顺序
getConstructors
的javadoc不会对订单发表评论,因此您不应该依赖于您观察到的特定订单,因为它可能会在JVM之间发生变化,甚至可能从一次运行变为另一次运行。
答案 3 :(得分:0)