Рекомендуемое решение - использовать архитектуру загрузчика службы .
Создание всех зарегистрированных реализаций MyInterface
может быть сделано так же просто, как
for(MyInterface my: ServiceLoader.load(MyInterface.class)) {
/* do something with <my> */
}
Чтобы это работало, недостаточно просто реализовать интерфейс, эти реализации должны быть объявлены как поставщики услуг, либо через запись в META-INF/services/
вашего jar-файла (как описано в документации по связанному классу), либо через provides
объявление в объявлении модуля Java при использовании Java 9 или новее.
Преимущество этого заключается не только в более высокой производительности по сравнению с поиском по всему пути к классам с помощью библиотеки отражений, но также гарантирует, что при будущем использовании модульной системы Java будут установлены необходимые права доступа.
См. Также Версия документации класса для Java 9 .