Мы уже говорили о том, что классы — это сложные типы данных. А теперь немного поговорим о второй стороне классов — обработке класса Java-машиной: в Java все является объектом, даже класс. Класс является объектом. Интересно? Тогда продолжим.
Загрузка класса в память
На самом деле, при загрузке класса в память создаются три специальных «объекта»:
Краткое описание картинки
Желтый прямоугольник:
Файл с кодом хранится на диске в виде файла с расширением «.class». Он содержит информацию о классе, его полях и методах, а также код методов, скомпилированный в байт-код.
Оранжевый прямоугольник:
Когда Java-машина загружает класс в память, она компилирует его байт-код в машинный код с учетом процессора компьютера и его операционной системы. Доступ к этому машинному коду есть только у Java-машины: у нас как у Java-программистов его нет.
Зеленый прямоугольник:
Java-машина создает некий объект, который содержит все статические переменные и методы класса. Доступ к этому «объекту» у вас есть по имени класса.
Например, когда вы пишете java.lang.Math.PI
, вы обращаетесь к статической переменной PI
, которая лежит в классе java.lang.Math
. Вот этот java.lang.Math
и есть наш зеленый прямоугольник. И именно у него внутри хранится статическая переменная PI
.
Синий прямоугольник:
Когда Java-машина загружает код класса в память, она создает специальный объект типа java.lang.Class
, в котором хранится информация о загруженном классе: его имя, имена методов, имена и типы полей и т.п.
Название «Class» может немного сбивать столку. Логичнее было бы его назвать ClassInfo: этот класс всего лишь хранит некую информацию о загруженном классе.
Получить объект класса можно у любого типа с помощью команды вида:
Class имя = ИмяКласса.class;
Примеры:
Код | Примечание |
---|---|
|
Получаем объект типа Class с информацией о классе String |
|
Получаем объект типа Class с информацией о классе Object |
|
Получаем объект типа Class с информацией о классе Integer |
|
Получаем объект типа Class с информацией о типе int |
|
Получаем объект типа Class с информацией о типе void |
Ссылку на объект с описанием класса можно получить и у объекта: для этого у каждого объекта есть метод getClass()
, унаследованный от класса Object
.
Примеры:
Код | Примечание |
---|---|
|
Тот же объект, что и String.class |
|
Тот же объект, что и Integer.class |
|
Тот же объект, что и Boolean.class |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ