В Java используется
динамическая загрузка классов. Ее выполняют загрузчики – наследники абстрактного класса
ClassLoader. Кроме того, они же загружают и
файлы-ресурсы.
Загрузка класса (точнее любого
ссылочного типа) и всех его предков происходит автоматически перед его
инициализацией. При этом используется тот лоадер, который загрузил текущий код. Таким образом, загрузка всех, даже встроенных классов –
ленивая.
Вручную класс можно загрузить из конкретного загрузчика, передав аргументом его метода
loadClass бинарное имя класса.
В
URLClassLoader и стандартных загрузчиках JVM источником класса служит
.class-файл. Другие загрузчики в своей реализации используют и другие источники: это может быть сетевой ресурс, или класс может генерироваться в рантайме. К примеру загрузчик из
javassist специализируется на создании классов на лету.
В результате загрузки создается экземпляр класса
Class. В отличие от обычных объектов, такие экземпляры хранятся не в куче, а в
permgen/metaspace.
Class может быть выгружен, когда загрузивший его
ClassLoader стал мусором.