Class.getConstructors()在Java

时间:2015-12-15 12:52:06

标签: java reflection

众所周知,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()

4 个答案:

答案 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文件作为简单文本文件处理。

Java documentions

  

返回一个包含反映所有的Constructor对象的数组   此Class对象表示的类的公共构造函数。一个   如果类没有公共构造函数,则返回长度为0的数组,   或者如果类是数组类,或者类是否反映了   原始类型或无效。请注意,此方法返回一个数组   构造函数对象(这是一个构造函数数组)   class),这个方法的返回类型是Constructor []而不是   可能是预期的构造函数[]。这个信息量较少的回报   类型是必要的,因为从这个方法返回后,   可以修改数组以保存不同的Constructor对象   类,这将违反Constructor []的类型保证。   返回:

答案 2 :(得分:0)

Class类有几种类似的方法,例如getInterfacesgetTypeParametrersgetMethodsgetFields等。

在大多数情况下,当订单定义明确时,会在javadoc中指定。例如,getInterfaces

  

数组中接口对象的顺序对应于此对象所表示的类声明的implements子句中接口名称的顺序

getConstructors的javadoc不会对订单发表评论,因此您不应该依赖于您观察到的特定订单,因为它可能会在JVM之间发生变化,甚至可能从一次运行变为另一次运行。

答案 3 :(得分:0)

订单未指定。 Class.getConstructors()方法的javadoc未提及构造函数的顺序。

这意味着即使你能弄清楚决定订单的因素,你也不能依赖所有JVM版本的订单。

有趣的是,Class.getMethods()方法的javadoc声明具体,您不应该依赖于返回方法的顺序。