Перечисление всех подклассов указанного c класса в Java - PullRequest
2 голосов
/ 14 января 2020

Как мне перечислить все подклассы определенного c класса или все реализации указанного c интерфейса в Java? Используя Eclipse, я могу это сделать, но я хочу знать, как выполнить это программно? Если у вас есть какие-либо предложения, пожалуйста, разместите их.

Ответы [ 2 ]

3 голосов
/ 14 января 2020

взгляните на отражение , Basi c использование этого:

Reflections reflections = new Reflections("com.package");    
Set<Class<? extends InterfaceExample>> classes = reflections.getSubTypesOf(InterfaceExample.class);
0 голосов
/ 14 января 2020

На мой взгляд, для этого требуются, как минимум, следующие шаги:

  1. Для текущего загрузчика классов выполните итерацию по пути к классам, чтобы получить список папок и JAR-файлов (это я знаю только как для URLClassLoader и его подтипов, которые URLClassLoader.getURLs())
  2. Посетите / прочитайте каждую папку или JAR в списке из (1), чтобы узнать классы в нем и загрузить каждый класс (может быть проблема здесь с загрузчиком классов, но вы можете получить его в большинстве случаев)
  3. Отразить и выяснить реализованные интерфейсы (если вы ищете потомков интерфейсов) или суперкласс (если класс). Это должно быть сделано итеративно, пока вы не достигнете java.lang.Object или целевого интерфейса или класса.

Повторите вышеуказанные шаги для родительского загрузчика классов, если родительский интерфейс или класс был загружен ими (скажем, java.util.List).

Все сказано и сделано, пожалуйста, будьте готовы к обработке памяти и ЦП. :)

Затмение, я думаю, постепенно индексирует иерархию. Вот почему в большинстве случаев он показывает результаты быстро. Я не уверен в этом, но, возможно, стоит изучить Eclipse, если он предоставляет способ доступа к своему списку иерархии типов во время выполнения (через реализации плагинов).

...