Обычно это делается с помощью процесса, называемого сканированием classpath. В общем случае загрузчики классов не позволяют сканировать все классы на пути к классам. Но обычно единственным используемым загрузчиком классов является UrlClassLoader
, из которого мы можем получить список каталогов и jar-файлов (см. getURLs ) и открыть их один за другим, чтобы вывести список доступных классов.
Этот подход реализован такими библиотеками, как Scannotation и Reflections .
Другой подход заключается в использовании API-интерфейса Java Pluggable Annotation Processing для написания процессора аннотаций, который будет собирать все аннотированные классы во время компиляции и для создания файла индекса для использования во время выполнения.
Данный механизм реализован в библиотеке ClassIndex .
Использование сканирования пути к классам обычно на два порядка медленнее, чем индексирование во время компиляции. См. этот тест .