Ответ
В заголовке каждого объекта в куче JVM хранится скрытая ссылка на его Class-объект (метаданные типа). Это внутренний механизм JVM для поддержки возможностей времени выполнения (Runtime).
Назначение этой ссылки:
- RTTI (Runtime Type Identification): Определение реального типа объекта во время выполнения.
Object obj = new ArrayList<>(); Class<?> actualClass = obj.getClass(); // Использует внутреннюю ссылку System.out.println(actualClass.getName()); // java.util.ArrayList - Динамическое связывание (Dynamic Dispatch): Для вызова виртуальных методов JVM использует эту ссылку, чтобы найти правильную реализацию в таблице виртуальных методов (vtable) класса.
- Рефлексия: Все операции
java.lang.reflect(получение методов, полей) работают черезClass-объект.
Структура заголовка объекта (зависит от JVM, пример для HotSpot):
- Mark Word: Хранит хэш-код объекта, данные для сборщика мусора, информацию о блокировке (для
synchronized). - Klass Pointer: Та самая ссылка на метаданные класса (
Class-объект). - Длина массива (только для массивов).
Практическое значение:
- Накладные расходы: Каждый объект имеет overhead в 8-16 байт на заголовок.
instanceofи приведение типов выполняются через проверку этой ссылки.- При сериализации
Class-объект не сериализуется, но его имя используется для поиска класса при десериализации.