Найдите классы Java, реализовав интерфейс [дубликат]

122
задан Peter Mortensen 31 March 2011 в 16:01
поделиться

5 ответов

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

я поместил свой пакет в библиотеку с открытым исходным кодом, которую я имею на своем веб-сайте. Библиотека здесь: http://software.clapper.org/javautil/ . Вы хотите запуститься с с класс ClassFinder .

утилита я записал, что это для является RSS-ридер, что я все еще использую каждый день, таким образом, код действительно имеет тенденцию быть осуществленным. Я использую ClassFinder для поддержки сменного API в RSS-ридере; на запуске это смотрит в паре деревьев каталогов для банок и файлов класса, содержащих классы, которые реализуют определенный интерфейс. Это намного быстрее, чем Вы могли бы ожидать.

библиотеке BSD-лицензируют, таким образом, можно безопасно связать ее кодом. Источник доступен.

, Если это полезно для Вас, помогите себе.

Обновление: при использовании Scala Вы могли бы найти эта библиотека быть более Scala-дружелюбными.

63
ответ дан 24 November 2019 в 01:25
поделиться

Код, о котором Вы говорите, походит ServiceLoader, , который был представлен в Java 6, чтобы поддерживать функцию, которая была определена с тех пор Java 1.3 или ранее. По причинам производительности это - рекомендуемый подход для нахождения интерфейсных реализаций во времени выполнения; если Вы нуждаетесь в поддержке для этого в более старой версии Java, я надеюсь, что Вы найдете моя реализация полезный.

существует несколько реализаций этого в более ранних версиях Java, но в пакетах солнца, не в базовом API (я думаю, что существуют некоторые классы, внутренние к ImageIO, которые делают это). Поскольку код прост, я рекомендовал бы обеспечить Вашу собственную реализацию вместо того, чтобы полагаться на нестандартный код Sun, который подвержен изменениям.

22
ответ дан 24 November 2019 в 01:25
поделиться

В полной общности эта функциональность невозможна. Механизм ClassLoder Java гарантирует только способность попросить класс с собственным именем (включая pacakge), и ClassLoder может предоставить класс, или это может указать, что не знает тот класс.

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

На практике, наиболее распространенный случай URLClassLoader, который ищет классы в списке каталогов файловой системы и файлов JAR. Таким образом, то, в чем Вы нуждаетесь, должно получить эти URLClassLoader, затем выполнить итерации через те каталоги и архивы, и для каждого файла класса Вы находите в них, запрашиваете соответствие Class объект и просматриваете возврат getInterfaces() метод.

6
ответ дан 24 November 2019 в 01:25
поделиться

Очевидно, Class.isAssignableFrom () говорит Вам, реализует ли класс индивидуума данный интерфейс. Таким образом проблема заставляет список классов тестировать.

Насколько я знаю, нет никакого прямого пути от Java для просьбы загрузчика класса "список классов, что Вы могли потенциально загрузка". Таким образом, необходимо будет сделать это сами путем итерации через видимые банки, вызова Class.forName () для загрузки класса, затем тестирования его.

Однако немного легче, если Вы просто хотите знать классы, реализовывая данный интерфейс от тех, которые имеют на самом деле загруженный:

  • через Инструментарий Java платформа, можно звонить Instrumentation.getAllLoadedClasses ()
  • через отражение, можно запросить поле ClassLoader.classes данного ClassLoder.

, Если Вы используете метод инструментария, затем (как объяснено в ссылке), что происходит, то, что Ваш класс "агента" называют по существу, когда JVM запускает и передала объект Инструментария. В той точке Вы, вероятно, хотите "сохранить его на потом" в статическом поле, и затем иметь Ваш код главного приложения называют его позже для получения списка загруженных классов.

5
ответ дан 24 November 2019 в 01:25
поделиться

Если бы Вы спрашивали с точки зрения разработки этого с под управлением программой затем, то необходимо обратиться к java.lang.* пакет. Если Вы получаете Объект класса, можно использовать isAssignableFrom метод, чтобы проверить, является ли это интерфейс другого Класса.

нет простого, созданного способом искать их, инструменты как Eclipse создают индекс этой информации.

, Если у Вас нет определенного списка Объектов класса для тестирования Вас, может смотреть на объект ClassLoder, использовать getPackages () метод и создать Ваш собственный итератор иерархии пакета.

Просто предупреждение, хотя это эти методы и классы может быть довольно медленно.

0
ответ дан 24 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

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