В чем разница между getDeclaredConstructors и getConstructors в API класса? - PullRequest
52 голосов
/ 24 ноября 2011

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

Ответы [ 4 ]

57 голосов
/ 24 ноября 2011

getDeclaredConstructors (когда вы хотите все конструкторы)

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

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

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

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

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

4 голосов
/ 24 ноября 2011

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

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

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

2 голосов
/ 24 ноября 2011

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

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

0 голосов
/ 19 февраля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...