Как я могу получить список всех реализаций интерфейса программно в Java?

Ключевое слово extern принимает различные формы в зависимости от среды. Если объявление доступно, ключевое слово extern принимает ссылку, указанную ранее в блоке перевода. В отсутствие такой декларации extern указывает внешнюю связь.

static int g();
extern int g(); /* g has internal linkage */

extern int j(); /* j has tentative external linkage */

extern int h();
static int h(); /* error */

Вот соответствующие абзацы из проекта C99 (n1256):

6.2.2 Связи идентификаторов

[... ]

4 Для идентификатора, объявленного с помощью спецификатора класса хранения extern в области видимости, в которой видна предварительная декларация этого идентификатора, 23) если предыдущее объявление указывает внутреннюю или внешнюю связь, связь идентификатор в более позднем объявлении совпадает с идентификатором, указанным в предыдущем объявлении. Если никакое предварительное объявление не видно или если в предыдущем объявлении не указана ссылка, то идентификатор имеет внешнюю привязку.

5 Если декларация идентификатора для функции не имеет спецификатора класса хранения, ее связь точно так же, как если бы он был объявлен с помощью спецификатора класса хранения extern. Если объявление идентификатора для объекта имеет область действия файла и спецификатор класса хранения, его связь является внешней.

69
задан user2427 7 December 2008 в 04:52
поделиться

5 ответов

В целом дорого сделать это. Для использования отражения класс должен быть загружен. Если Вы хотите загрузить каждый класс, доступный на пути к классу, который займет время и память и не рекомендуется.

, Если бы Вы хотите избежать этого, необходимо было бы реализовать собственный синтаксический анализатор файла класса, который работал более эффективно вместо отражения. Библиотека разработки кода байта может помочь с этим подходом.

механизм Поставщика услуг является стандартными средствами перечислить реализации сменного сервиса. Используйте ServiceLoader в Java 6 или реализуйте свое собственное в более ранних версиях. Я обеспечил пример в другом ответе.

25
ответ дан Community 7 November 2019 в 09:50
поделиться

Какие сказанные erickson, но если Вы все еще хотите сделать это тогда, смотрят на Отражения . От их страницы:

Используя Отражения можно запросить метаданные для:

  • добираются, все подтипы некоторого типа
  • добираются, все типы, аннотируемые некоторой аннотацией
  • , получают все типы, аннотируемые некоторой аннотацией, включая параметры аннотации, соответствующие
  • , получают все методы, аннотируемые [приблизительно 115]
28
ответ дан Aldo 7 November 2019 в 09:50
поделиться

Да, первый шаг должен определить "все" классы, о которых Вы заботились. Если у Вас уже есть эта информация, можно перечислить через каждого из них и использовать instanceof для проверки отношений. Похожая статья здесь: http://www.javaworld.com/javaworld/javatips/jw-javatip113.html

4
ответ дан Zhichao 7 November 2019 в 09:50
поделиться

Какой сказанный erikson является лучшим. Вот связанный поток вопроса и ответа - http://www.velocityreviews.com/forums/t137693-find-all-implementing-classes-in-classpath.html

, библиотека Apache BCEL позволяет Вам читать классы, не загружая их. Я полагаю, что это будет быстрее, потому что необходимо быть в состоянии пропустить шаг проверки. Другая проблема с загрузкой всех классов с помощью classloader состоит в том, что Вы перенесете огромное влияние памяти, а также непреднамеренно выполните любые статические блоки кода, которые Вы, вероятно, не хотите делать.

ссылка библиотеки Apache BCEL - http://jakarta.apache.org/bcel/

4
ответ дан 7 November 2019 в 09:50
поделиться

Кроме того, если Вы пишете плагин IDE (где то, что Вы пытаетесь сделать, относительно распространено), тогда IDE обычно предлагает Вам более эффективные способы получить доступ к иерархии классов текущего состояния пользовательского кода.

1
ответ дан Uri 7 November 2019 в 09:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: