Как я могу найти все реализации интерфейса в classpath?

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

Ответ 1

В лучшем случае это будет дорого. В худшем случае (в зависимости от загрузчиков классов) это может быть невозможно.

Я настоятельно рекомендую вам искать альтернативный подход к основной проблеме, которую вы пытаетесь решить.

Ответ 2

Библиотека Reflections позволит вам сделать это (в некоторой степени):

Set<Class<? extends SomeClassOrInterface>> subTypes = 
     reflections.getSubTypesOf(SomeClassOrInterface.class);

Однако я бы не рекомендовал этого. Представьте себе типичный путь класса с 50 внешними банками, каждый из которых является большой структурой, такой как spring, спящий режим, aspectj, jsf и т.д. Это займет много времени.

Если вы хотите иметь какой-то механизм плагина, чтобы другие могли реализовывать ваши интерфейсы и поставлять банки с реализацией, посмотрите java.util.ServiceLoader

Ответ 3

С ClassGraph это довольно просто:

Groovy-код для поиска реализаций my.package.MyInterface:

@Grab('io.github.classgraph:classgraph:4.6.18')
import io.github.classgraph.*
new ClassGraph().enableClassInfo().scan().getClassesImplementing('my.package.MyInterface').findAll{!it.abstract}*.className