Как порядок массива, который возвращает Class.getConstructors() в Java

Как мы все знаем, отражение 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()

Ответ 1

Когда я смотрю класС# getDeclaredConstructors() - метод, я заметил следующую строку:

"Элементы возвращаемого массива не сортируются и не находятся в каком-либо конкретном порядке."

В класС# getConstructors() - метод это не упоминается, хотя.. Несмотря на то, что это не упоминается, мое предположение заключается в том, что то же самое относится к этому методу, который доказывает ваш тип кода.

Я не уверен, чего вы хотите выполнить (возможно, вы могли бы добавить свою цель к своему вопросу, чтобы мы могли помочь вам дальше), но я не думаю, что можно получить конструкторы в том же порядке используя отражение.


EDIT: с помощью конструкторов в вашем примере вы можете вызвать любой из трех таких:

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

Ответ 2

Поскольку порядок конструктора не имеет значения для классов java, для метода метода getConstructors нет спецификации. Я думаю, что тестирование вы можете определить порядок по умолчанию, но я не буду использовать его, как может измениться в любое время. Если вы хотите получить определенные параметры проверки конструктора или если порядок имеет значение для обработки файла .java в виде простого текстового файла.

Документация по Java.

Возвращает массив, содержащий объекты конструктора, отражающие все общедоступные конструкторы класса, представленные этим объектом класса. массив длины 0 возвращается, если класс не имеет общих конструкторов, или если класс является классом массива, или если класс отражает примитивный тип или пустота. Обратите внимание, что хотя этот метод возвращает массив объектов Constructor (это массив конструкторов из этого class), возвращаемым типом этого метода является Constructor [], а не Конструктор [], как и следовало ожидать. Это менее информативное возвращение тип необходим, поскольку после возвращения из этого метода массив может быть изменен для хранения объектов Constructor для разных классы, которые будут нарушать гарантии типа Constructor []. Возвращает:

Ответ 3

Класс Class имеет несколько похожих методов, таких как getInterfaces, getTypeParametrers, getMethods, getFields и т.д.

В большинстве случаев, когда порядок определен корректно, он указан в javadoc. Например, getInterfaces:

Порядок объектов интерфейса в массиве соответствует порядку имен интерфейсов в предложении implements объявления класса, представленного этим объектом

javadoc getConstructors не комментирует порядок и , поэтому вам не следует полагаться на определенный вами порядок, поскольку он может изменяться в JVM и, возможно, даже из одного прогона в другой. p >

Ответ 4

Заказ не указан. javadoc для метода Class.getConstructors() не упоминает порядок конструкторов.

Это означает, что даже если вы можете определить, что определяет порядок, вы не можете полагаться на то, что порядок одинаковый для всех версий JVM.

Интересно, что javadoc для метода Class.getMethods() указывает, что вы не должны полагаться на порядок возвращаемых методов.