Вопрос-ответ

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.

Ответ 2

Spring может сделать это за вас...

BeanDefinitionRegistry bdr = new SimpleBeanDefinitionRegistry();
ClassPathBeanDefinitionScanner s = new ClassPathBeanDefinitionScanner(bdr);

TypeFilter tf = new AssignableTypeFilter(CLASS_YOU_WANT.class);
s.addIncludeFilter(tf);
s.scan("package.you.want1", "package.you.want2");
String[] beans = bdr.getBeanDefinitionNames();

Примечание. Фильтр шрифтов важен, если вы хотите получить правильные результаты!
Здесь вы также можете использовать фильтры исключения.

Сканер можно найти в spring-context jar, реестр - в spring-beans, фильтр типов - в spring-core.

Ответ 3

Мне очень нравится библиотека reflections для этого.

Он предоставляет множество различных типов сканеров (getTypesAnnotatedWith, getSubTypesOf и т.д.), и написать или расширить свой собственный чертовски просто.

Ответ 4

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

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

java