Это возможно сделать (беспорядочно) в некоторых случаях; например если классы вашего приложения загружаются из локальных каталогов или файлов JAR. По сути, вам нужно сопоставить имя пакета с путем и использовать API File и / или ZipFile для поиска файлов в соответствующем «каталоге», имя которого заканчивается на «.class». Затем вы используете Class.forName()
, загружаете соответствующие классы (пытаясь избежать их инициализации) и используете clazz.isAssignableFrom(subclazz)
, чтобы увидеть, какие из них являются подклассами.
Но это не сработает во всех случаях. Одна из проблем заключается в том, что ClassLoader API не поддерживает итерацию по всем классам / пакетам, которые он может загрузить.
Я бы порекомендовал вам найти альтернативный подход к проблеме, которую вы пытаетесь решить.
РЕДАКТИРОВАТЬ - в ответ на этот комментарий.
Кажется, это серьезная ошибка в API отражения Java
Я понимаю, что упущение является преднамеренным. Если бы API загрузчика классов включал метод для предоставления всех классов в пакете, это ограничило бы схемы, которые можно использовать для загрузки классов. Например, URLClassLoader не может быть реализован для URL-адресов «http:», поскольку протокол HTTP не обеспечивает стандартный способ получения записей в каталоге.
Кроме того, есть несколько ситуаций, когда производственное приложение действительно должно рефлексивно найти все классы в пакете.