Символические ссылки в Java

в эти дни я играл с Java reflection и . В настоящее время я изучаю ldc инструкция.

в спецификации JVM я нашел термин, который я не понимаю:символическая ссылка и у меня есть следующие вопросы.

  1. что это значит?

  2. где он используется?

  3. в каких случаях ldc инструкция загрузить символ ссылка?
  4. есть ли какой-либо код в Java, соответствующий этому действию?

1 ответов


было бы полезно, если бы вы процитировали точную часть документации, которая дает вам проблемы. Поскольку вы этого не сделали, я собираюсь угадать, что вы могли бы процитировать из doc для ldc:

в противном случае, если запись пула констант времени выполнения является символической ссылкой к классу (§5.1), тогда именованный класс разрешен (§5.4.3.1) и a ссылка на объект Class, представляющий этот класс, value, является помещается в операнд стек.

в противном случае запись пула констант времени выполнения должна быть символьной ссылка на тип метода или дескриптор метода (§5.1). ...

эта цитата имеет ссылку на другой раздел спецификации JVM (5.1), который описывает пул констант времени выполнения:

структура данных времени выполнения которая служит много из целей таблица символов реализации обычного языка программирования

что это означает что пул констант времени выполнения содержит информацию о фрагментах класса в символической форме: в виде текстовых значений.

Итак, когда ldc дается "символическая ссылка" на класс, ему присваивается индекс CONSTANT_Class_info структура в постоянном пуле. Если вы посмотрите на определение этой структуры, вы увидите, что она содержит ссылку на имя класса, также содержащегося в пуле констант.

TL; DR: "символические ссылки" - это строки, может использоваться для извлечения фактического объекта.


пример:

if (obj.getClass() == String.class) {
    // do something
}

становится следующим байт-кодом:

aload_1
invokevirtual   #21; //Method java/lang/Object.getClass:()Ljava/lang/Class;
ldc     #25; //class java/lang/String
if_acmpne       20

в этом случае ldc операция относится к классу, который хранится символически. Когда JVM выполняет этот код операции, он будет использовать символическую ссылку для идентификации фактического класса в текущем загрузчике классов и возвращает ссылку на экземпляр класса.