Какова цель включения java.lang.Object в интерфейс Constant Pool?
Компиляция следующего интерфейса:
package test;
public interface MyInterface {
public void foo();
}
и проверка скомпилированного кода с помощью javap -v -s test.MyInterface
показывает следующие (-s
подпись подписей участников):
Compiled from "MyInterface.java"
public interface test.MyInterface
SourceFile: "MyInterface.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
#1 = Class #7 // test/MyInterface
#2 = Class #8 // java/lang/Object
#3 = Utf8 foo
#4 = Utf8 ()V
#5 = Utf8 SourceFile
#6 = Utf8 MyInterface.java
#7 = Utf8 test/MyInterface
#8 = Utf8 java/lang/Object
{
public abstract void foo();
Signature: ()V
flags: ACC_PUBLIC, ACC_ABSTRACT
}
Мой вопрос: почему существует java.lang.Object
в пуле констант, зная, что интерфейс не наследуется от класса Object
?
Также, если я изменил определение интерфейса на:
public interface MyInterface extends Comparable<MyInterface> {
public void foo();
}
и запустите javap
, я получаю следующее:
Compiled from "MyInterface.java"
public interface test.MyInterface extends java.lang.Comparable<test.MyInterface>
Signature: #7 // Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>;
SourceFile: "MyInterface.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
...
В чем заключается цель включения java.lang.Object
в подпись Ljava/lang/Object;Ljava/lang/Comparable<Ltest/MyInterface;>;
интерфейса?
Кроме того, если я попытаюсь просмотреть байт-код с помощью инструмента (в частности, JBE), он неверно показывает, что MyInterface
имеет java.lang.Object
как суперкласс с именем класса java.lang.Object
, сохраненным в пуле констант:
![JBE screenshot]()
Примечание: Использование jdk1.7.0_75
Ответы
Ответ 1
Эта ссылка класса Object
в пуле констант является результатом того, как формат файла класса был определен в Спецификация Java VM.
Файл класса состоит из одной структуры ClassFile:
ClassFile {
u4 magic; // The Famous 0xCAFEBABE
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
...
}
Относительно этого super_class
этот раздел спецификации JVM имеет значение для вашего интерфейса MyInterface
:
super_class
Для интерфейса значение элемента super_class всегда должно быть действительный индекс в таблицу констант_путешествия. Постоянная запись в этот индекс должен быть структурой CONSTANT_Class_info
, представляющей class Object
.
По существу, константа java/lang/Object
необходима только для заполнения элемента super_class
допустимым значением.
Все экземпляры Java всегда являются экземплярами базового класса Object
, но на этот раз реальный ответ больше связан с тем, как была построена JVM и с конкретными вариантами реализации, а не с самим языком.
Кроме того, как отметил @Holger, этот параграф также стоит упомянуть:
Если значение элемента super_class
равно нулю, тогда этот файл класса должен представлять класс Object
, единственный класс или интерфейс без прямой суперкласс.
Ответ 2
На самом деле все в Java Object
. В Java каждая конструкция является объектом.
Class IS Object
Interface IS Object
Enum IS Object.
Поэтому, когда вы создаете программу Object
, автоматически упаковывается. Поскольку *.class
может использоваться на другой JVM.
@user43250937 правильно в этом случае .
JVM Spec :
Скомпилированный код, который должен быть запущен виртуальной машиной Java, представлен с использованием не зависящего от оборудования и операционной системы двоичного формата, обычно (но не обязательно), хранящегося в файле, известного как формат файла класса. Формат файла класса точно определяет представление класса или интерфейса, включая такие сведения, как порядок байтов, который может быть принят как данность в формате объектного файла для платформы
Возможно, эта ссылка предоставлена для получения дополнительной информации.
Java-bytecode-fundamentals-using-objects-and-calling-methods
Посмотрите
4: invokeinterface #5, 1; //InterfaceMethod Job.execute:()Ljava/lang/Object;
Спецификация JVM