1

如果我有这些文件:

//Gizmo.java
public class Gizmo {
    public static void main(String[] args) {
        Gadget g = new Gadget();
    }
}

.

//Gadget.java
public class Gadget {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

我用 编译它们javac Gizmo.java Gadget.java,然后我有一个问题。该文件如何Gizmo.class引用“小工具”类?文件中的某处是否只有一个字符串“Gadget”?

4

2 回答 2

1

如评论所述,您可以在此处找到格式的确切定义:http: //docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2

它的长短(根据我的理解)是有一个 UTF-8 字符串,它说明了被引用的类的名称,然后我猜要么有 a)与之关联的任意数字,要么 b)使用该字符串的地址,以便二进制类文件的其余部分仅使用该数字来引用该类。

例如,如果您编译问题中的示例代码,然后Gizmo.class使用文本编辑器打开,您将在其中看到字符串“Gadget”。

于 2013-07-03T19:46:43.427 回答
1

您的答案在于JLS4.2.1的以下行:

出现在类文件结构中的类和接口名称始终以称为二进制名称的完全限定形式表示(JLS §13.1)。此类名称始终表示为 CONSTANT_Utf8_info 结构(第 4.4.7 节),因此可以在没有进一步限制的情况下从整个 Unicode 代码空间中绘制。类和接口名称从那些 CONSTANT_NameAndType_info 结构(第 4.4.6 节)中引用,这些结构将这些名称作为其描述符的一部分(第 4.3 节),以及从所有 CONSTANT_Class_info 结构(第 4.4.1 节)中引用。

由于历史原因,出现在类文件结构中的二进制名称的语法不同于 JLS §13.1 中记录的二进制名称的语法。在这种内部形式中,通常分隔构成二进制名称的标识符的 ASCII 句点 (.) 被替换为 ASCII 正斜杠 (/)。标识符本身必须是非限定名称(第 4.2.2 节)。

于 2013-07-03T19:47:53.797 回答