Find Java classes implementing an interface [duplicate]
Поиск классов Java, реализующих интерфейс [дубликат]
Некоторое время назад я наткнулся на фрагмент кода, в котором использовалась некоторая часть стандартной функциональности Java для поиска классов, реализующих данный интерфейс. Я знаю, что функции были спрятаны в каком-то нелогичном месте, но они могли использоваться для других классов, как следует из названия пакета. Тогда мне это было не нужно, поэтому я забыл об этом, но теперь мне это нужно, и, похоже, я не могу снова найти функции. Где можно найти эти функции?
Редактировать: Я не ищу какие-либо функции IDE или что-то еще, а скорее что-то, что может быть выполнено в приложении Java.
Переведено автоматически
Ответ 1
Некоторое время назад я собрал пакет для выполнения того, что вы хотите, и не только. (Он был нужен мне для утилиты, которую я писал). В нем используется библиотека ASM. Вы можете использовать отражение, но оказалось, что ASM работает лучше.
Я поместил свой пакет в библиотеку с открытым исходным кодом, которая есть у меня на веб-сайте. Библиотека находится здесь: http://software.clapper.org/javautil / . Вы хотите начать с класса ClassFinder.
Утилита, для которой я ее написал, - это программа для чтения RSS, которой я до сих пор пользуюсь каждый день, поэтому код имеет тенденцию к отработке. Я использую ClassFinder для поддержки подключаемого API в RSS-ридере; при запуске он ищет в нескольких деревьях каталогов jar и файлы классов, содержащие классы, реализующие определенный интерфейс. Это намного быстрее, чем вы могли ожидать.
Библиотека лицензирована BSD, поэтому вы можете безопасно использовать ее в своем коде. Исходный код доступен.
Если это вам полезно, помогите себе.
Обновление: Если вы используете Scala, вы можете обнаружить, что эта библиотека более удобна для Scala.
Он предоставляет множество различных типов сканеров (getTypesAnnotatedWith, getSubTypesOf и т.д.), и написать или расширить свой собственный чертовски просто.
Ответ 4
Код, о котором вы говорите, звучит как ServiceLoader, который был представлен в Java 6 для поддержки функции, которая была определена начиная с Java 1.3 или более ранней. Из соображений производительности это рекомендуемый подход для поиска реализаций интерфейса во время выполнения; если вам нужна поддержка для этого в более старой версии Java, я надеюсь, что вы найдете мою реализацию полезной.
Есть пара реализаций этого в более ранних версиях Java, но в пакетах Sun, а не в core API (я думаю, что есть несколько внутренних классов ImageIO, которые делают это). Поскольку код прост, я бы рекомендовал предоставить вашу собственную реализацию, а не полагаться на нестандартный код Sun, который может быть изменен.