Как JVM узнает класс объекта во время выполнения - PullRequest
4 голосов
/ 27 апреля 2010

Как jvm знает, к какому классу относится экземпляр объекта во время выполнения. Я знаю, что мы можем использовать метод getClass, чтобы получить имя класса, но как работает метод getClass? Спасибо, Praveen.

Ответы [ 4 ]

5 голосов
/ 27 апреля 2010

ответ? Магия!

Нет, серьезно, это определяется реализацией, и реализация JVM не должна использовать одну простую технику, такую ​​как хранение класса в качестве ссылки в поле с постоянным смещением в данных экземпляра. Все, что для этого нужно, - убедиться, что метод getClass заметно работает так, как задокументировано. Например, с помощью escape-анализа JVM может размещать экземпляр статически в куче, потому что он знает, что экземпляр не переживает кадр стека. В этом случае он может предпочесть превратить вызов getClass() в прямую загрузку экземпляра Class, а не вызов метода вообще! Точно так же, поскольку getClass() логически является виртуальным методом (я знаю, что он финальный, но его возвращаемое значение является постоянным во всех экземплярах класса из любого данного загрузчика классов, но отличается для каждого отдельного класса, как если бы он был виртуальным, который возвращал константу значение), он может подвергаться оптимизации, аналогичной встроенному кэшированию .

2 голосов
/ 27 апреля 2010

Я не знаю специфики JVM, но в большинстве объектно-ориентированных систем с языком + среда выполнения (Delphi, C ++, .NET) к данным экземпляра объекта добавляется скрытое поле, которое указывает на информацию о типе экземпляра объекта. ,

Необходимо соблюдать осторожность при отображении экземпляра объекта непосредственно на внешнюю структуру данных, поскольку информация о скрытом типе или указатель таблицы виртуального метода в данных экземпляра объекта нарушит выравнивание с полями во внешней структуре данных.

Обычно этот артефакт можно увидеть, посмотрев на размер экземпляра объекта. Sizeof () или эквивалентный. Объект без объявленных полей все равно будет иметь объем памяти больше нуля. Вот откуда приходит информация о типах.

0 голосов
/ 02 октября 2014

Как указывалось в предыдущих ответах, реализация не указана.

Чтобы получить представление о том, как может выглядеть реализация, я рассмотрел часть времени выполнения недавней JVM Hotspot. В Hotspot каждый объект начинается со слова метки (для GC и других целей) и указателя класса. Если вы вызываете getClass, будет вызвана нативная реализация в Object.c:

JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
    if (this == NULL) {
        JNU_ThrowNullPointerException(env, NULL);
        return 0;
    } else {
        return (*env)->GetObjectClass(env, this);
    }
}

GetObjectClass является частью JNI API. (http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html) Внутренняя реализация JNI GetObjectClass действительно просто разрешает указатель объекта, читает класс из указателя класса, и возвращает Java-представление этого класса:

JNI_ENTRY(jclass, jni_GetObjectClass(JNIEnv *env, jobject obj))
  JNIWrapper("GetObjectClass");

  HOTSPOT_JNI_GETOBJECTCLASS_ENTRY(env, obj);

  Klass* k = JNIHandles::resolve_non_null(obj)->klass();
  jclass ret =
    (jclass) JNIHandles::make_local(env, k->java_mirror());

  HOTSPOT_JNI_GETOBJECTCLASS_RETURN(ret);
  return ret;
JNI_END
0 голосов
/ 27 апреля 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...