Ключевое слово 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. Если объявление идентификатора для объекта имеет область действия файла и спецификатор класса хранения, его связь является внешней.
blockquote>
В целом дорого сделать это. Для использования отражения класс должен быть загружен. Если Вы хотите загрузить каждый класс, доступный на пути к классу, который займет время и память и не рекомендуется.
, Если бы Вы хотите избежать этого, необходимо было бы реализовать собственный синтаксический анализатор файла класса, который работал более эффективно вместо отражения. Библиотека разработки кода байта может помочь с этим подходом.
механизм Поставщика услуг является стандартными средствами перечислить реализации сменного сервиса. Используйте ServiceLoader
в Java 6 или реализуйте свое собственное в более ранних версиях. Я обеспечил пример в другом ответе.
Какие сказанные erickson, но если Вы все еще хотите сделать это тогда, смотрят на Отражения . От их страницы:
Используя Отражения можно запросить метаданные для:
- добираются, все подтипы некоторого типа
- добираются, все типы, аннотируемые некоторой аннотацией
- , получают все типы, аннотируемые некоторой аннотацией, включая параметры аннотации, соответствующие
- , получают все методы, аннотируемые [приблизительно 115]
Да, первый шаг должен определить "все" классы, о которых Вы заботились. Если у Вас уже есть эта информация, можно перечислить через каждого из них и использовать instanceof для проверки отношений. Похожая статья здесь: http://www.javaworld.com/javaworld/javatips/jw-javatip113.html
Какой сказанный erikson является лучшим. Вот связанный поток вопроса и ответа - http://www.velocityreviews.com/forums/t137693-find-all-implementing-classes-in-classpath.html
, библиотека Apache BCEL позволяет Вам читать классы, не загружая их. Я полагаю, что это будет быстрее, потому что необходимо быть в состоянии пропустить шаг проверки. Другая проблема с загрузкой всех классов с помощью classloader состоит в том, что Вы перенесете огромное влияние памяти, а также непреднамеренно выполните любые статические блоки кода, которые Вы, вероятно, не хотите делать.
ссылка библиотеки Apache BCEL - http://jakarta.apache.org/bcel/
Кроме того, если Вы пишете плагин IDE (где то, что Вы пытаетесь сделать, относительно распространено), тогда IDE обычно предлагает Вам более эффективные способы получить доступ к иерархии классов текущего состояния пользовательского кода.