На мой взгляд, для этого требуются, как минимум, следующие шаги:
- Для текущего загрузчика классов выполните итерацию по пути к классам, чтобы получить список папок и JAR-файлов (это я знаю только как для
URLClassLoader
и его подтипов, которые URLClassLoader.getURLs()
) - Посетите / прочитайте каждую папку или JAR в списке из (1), чтобы узнать классы в нем и загрузить каждый класс (может быть проблема здесь с загрузчиком классов, но вы можете получить его в большинстве случаев)
- Отразить и выяснить реализованные интерфейсы (если вы ищете потомков интерфейсов) или суперкласс (если класс). Это должно быть сделано итеративно, пока вы не достигнете
java.lang.Object
или целевого интерфейса или класса.
Повторите вышеуказанные шаги для родительского загрузчика классов, если родительский интерфейс или класс был загружен ими (скажем, java.util.List
).
Все сказано и сделано, пожалуйста, будьте готовы к обработке памяти и ЦП. :)
Затмение, я думаю, постепенно индексирует иерархию. Вот почему в большинстве случаев он показывает результаты быстро. Я не уверен в этом, но, возможно, стоит изучить Eclipse, если он предоставляет способ доступа к своему списку иерархии типов во время выполнения (через реализации плагинов).