Подтвердить что ты не робот

В чем разница между getDeclaredConstructors и getConstructors в API класса?

Я заметил, что в API Java Reflection существует два разных метода для вызова конструкторов: метод getDeclaredConstructors/getConstructors. Хотя документы Java немного отличаются (getDeclaredConstructors означает, что он возвращает ВСЕ конструкторы, а не публичные), непонятно, почему API явно поддерживает эти два разных метода.

Что еще более важно, мне интересно: когда один метод предпочтительнее другого, если мы вызываем классы динамически? Например, какова цель доступа к частному конструктору?

4b9b3361

Ответ 1

getDeclaredConstructors (если вы хотите все конструкторы)

Возвращает массив объектов Constructor, отражающих все конструкторы, объявленные классом, представленным этим объектом класса. Это открытый, защищенный, доступ по умолчанию (пакетный) и частные конструкторы.

getConstructors (если вы хотите конструкторы только public)

Возвращает массив, содержащий объекты Constructor, отражающие все общедоступные конструкторы класса, представленные этим объектом класса.

Итак, глядя на документы для них обоих, я думаю, что разница в том, что getConstructors возвращает только конструкторы public, а getDeclaredConstructors возвращает все конструкторы (public, protected, default (package) доступ и private)

Итак, легко, если вам нужны только конструкторы public, тогда используйте getConstructors. В противном случае, если вам нужны все конструкторы (не обращая внимания на модификатор доступа конструктора), используйте getDeclaredConstructors.

Ответ 2

Метод 'getDeclaredConstructors' возвращает только конструкторы, объявленные внутри класса. Метод getConstructors также возвращает конструкторы, которые не объявлены внутри класса, но наследуются от суперклассов.

Итак, это зависит от того, что вы собираетесь делать. Нет правильного подхода, это действительно зависит, если вам также нужны суперконструкторы.

Ответ 3

Существуют методы getDeclaredXX() для манипулирования классами, которые не обязательно были предназначены создателем этих классов. Обратите внимание, что существует метод getDeclaredMethod(), который позволяет вам вызывать частные методы и метод getDeclaredField(), который позволяет вам получать/устанавливать частные поля.

Я не совсем уверен в "законных" случаях использования, но они, очевидно, полезны для выполнения определенных вещей. Кроме того, это семейство методов возвращает только те вещи, которые специально объявлены в классе, а не вещи, которые существуют в классе из-за суперкласса.

Доступ к частному конструктору может быть полезен по тем же причинам, я полагаю.

Ответ 4

Я использую getDeclaredConstructors для создания factory классов, чей конструктор является приватным, чтобы избежать того, что "пользователи" моей системы могут создавать эти классы напрямую, не используя factory. Я считаю этот метод весьма полезным.