如果我有这些文件:
//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”吗?
答案 0 :(得分:1)
如上所述,您可以在此处找到格式的确切定义:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.2
它的长短(根据我的理解)是有一个UTF-8字符串,它表明被引用的类的名称,然后我猜测有一个a)与之关联的任意数字或b)使用该字符串的地址,以便二进制类文件的其余部分仅使用该数字来引用该类。
例如,如果您在问题中编译示例代码,然后使用文本编辑器打开Gizmo.class
,那么您将在其中看到字符串“Gadget”。
答案 1 :(得分: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)。