Что такое Класс и КлассКласс

Что такое Klass и KlassKlass в реализации точки доступа JVM?

Насколько я понял из статьи Представление пермского поколения, Klass — это внутреннее представление класс Java (скажем, A) и он будет содержать основную информацию о структуре класса, включая байт-код. Он будет храниться как сам объект. Каждый объект класса A будет иметь указатель на внутреннее представление Klass, присутствующее в PermGen.

КлассКласс — это внутреннее представление самого класса Klass. Зачем нужен KlassKlass? Какую дополнительную информацию он хранит?

Также указатель KlassKlass's Klass указывает на себя, я тоже не понял.


person Vivek    schedule 23.05.2013    source источник


Ответы (2)


Постоянное поколение, также известное как permgen, — это место, где хранится вся информация, относящаяся к классу. Иногда его называют областью методов.

Возьмем пример следующего кода:

public class Parent
{
    ...
}

Здесь:

  • new Parent() является объектом класса Parent.
  • (new Parent()).getClass() относится к Klass родителя. Тип ссылки для этого объекта будет java.lang.Class<Parent>. Здесь будет храниться информация об аннотациях, конструкторах, полях, методах Parent, его наследовании (суперкласс, интерфейсы) и т. д.
  • КлассКласс будет (new Parent()).getClass().getClass(). Тип ссылки для этого объекта будет java.lang.Class<java.lang.Class>. Это определяет информацию об аннотациях, конструкторах, полях, методах java.lang.Class, его наследовании (суперкласс, интерфейсы) и т. д.

Теоретически эта цепочка может продолжаться, но КлассКлассКласс будет таким же, как КлассКласс.

Короче говоря, КлассКласс означает, что у вас будет один объект java.lang.Class, который определяет поведение самого java.lang.Class.

Надеюсь это поможет

person Chris    schedule 11.06.2013

Кажется, у вас есть хорошее общее представление об управлении хранилищем в HotSpot. Чтобы получить некоторые более конкретные сведения, рекомендуется обратиться к разработчикам HotSpot. Эта страница является их описанием системы управления хранением.

В ситуациях, когда я хочу узнать, что делает какой-то код, я пытаюсь найти код и прочитать его. В этом случае мы можем найти реализацию класса KlassKlass здесь. Похоже, это не добавляет дополнительной информации поверх Klass — очень интересно посмотреть. Обратите внимание, что KlassKlass расширяет Klass.

Так зачем нам это нужно? Что ж, мы можем изобразить Klass иерархию конкретной программы в виде дерева, где одно Klass описывает другое. Все нуждается в описании, но мы не можем продолжать так вечно, нам нужно найти фиксированная точка, где вещь, которую мы используем для описания чего-либо, является собой, поэтому мы можем остановиться!

Таким образом, KlassKlass не делает ничего более полезного, чем существование. Он должен существовать, но его существование достаточно неинтересно.

person selig    schedule 11.06.2013