Мы уже говорили о том, что классы — это сложные типы данных. А теперь немного поговорим о второй стороне классов — обработке класса 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 a = String.class;
Получаем объект типа Class с информацией о классе String
Class b = Object.class;
Получаем объект типа Class с информацией о классе Object
Class c = Integer.class;
Получаем объект типа Class с информацией о классе Integer
Class d = int.class;
Получаем объект типа Class с информацией о типе int
Class e = void.class;
Получаем объект типа Class с информацией о типе void

Ссылку на объект с описанием класса можно получить и у объекта: для этого у каждого объекта есть метод getClass(), унаследованный от класса Object.

Примеры:

Код Примечание
Class a = "Привет".getClass();
Тот же объект, что и String.class
Class b = new Integer().getClass();
Тот же объект, что и Integer.class
Class c = Boolean.TRUE.getClass();
Тот же объект, что и Boolean.class