В некоторых случаях можно делать (беспорядочно); например если классы вашего приложения загружаются из локальных каталогов или файлов JAR. В основном вам нужно сопоставить имя пакета с именем пути и использовать API файлов и/или ZipFile для поиска файлов в соответствующем «каталоге», чье имя заканчивается на «.class». Затем вы используете Class.forName()
загружать соответствующие классы (пытаясь избежать их инициализации) и использовать clazz.isAssignableFrom(subclazz)
, чтобы увидеть, какие из них являются подклассами.
Но это не будет работать во всех случаях. Одна из проблем заключается в том, что API ClassLoader не поддерживает итерацию по всем классам/пакетам, которые он может загрузить.
Я бы порекомендовал вам найти альтернативный подход к проблеме, которую вы связываете, чтобы обратиться.
EDIT - в ответ на этот комментарий.
Кажется, это массивная ошибка в Java Reflection API
Я понимаю, что это упущение является преднамеренным. Если API-интерфейс classloader сделал, включите метод предоставления всех классов в пакете, он ограничит схемы, которые можно использовать для загрузки классов. Например, URLClassLoader не может быть реализован для URL «http:», потому что HTTP-протокол не предоставляет стандартный способ получения записей в каталоге.
Кроме того, существует несколько ситуаций, когда производственное приложение действительно должно отражать все классы в пакете.
В конце концов, я сделал найти альтернативное решение, которое является бит беспорядок, но это лучше, чем любой из решений, которые я читал (например, этот). Похоже, что это массивная ошибка API-интерфейса java :( – Martin
Я вижу вашу точку с ответом на мой комментарий. Хотя вы всегда можете подклассы Пакет с «searchablePackage», который позволяет перечислять и искать среди своих классов: P – Martin
@Martin - Как бы вы его реализовали?Основная проблема заключается в том, что невозможно * реализовать * итерацию над загружаемыми классами в пакете ... без необходимости выполнять некоторые виды загрузчиков классов. –