Я реализую интерфейс, и теперь мне бы хотелось получить все реализации этого интерфейса в 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