编译以下接口:
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:

注:使用jdk1.7.0_75
发布于 2015-06-01 14:35:42
常量池中的Object类引用是如何在Java规范中定义类文件格式的结果。
类文件由单个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_pool表的有效索引。该索引处的constant_pool条目必须是表示类
Object的CONSTANT_Class_info结构。
因此,从本质上说,只需要java/lang/Object常量就可以用有效值填充super_class项。所有的Object实例都是基本Java类的实例,但这一次真正的答案更多的是关于JVM是如何构建的,以及具体的实现选择,而不是语言本身。
此外,正如@Holger所指出的,这一段也值得一提:
如果
super_class项的值为零,则该类文件必须表示类Object,这是唯一没有直接超类的类或接口。
发布于 2015-06-01 14:35:00
实际上,所有的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;https://stackoverflow.com/questions/30575597
复制相似问题