字节码如何代表另一个类

时间:2013-07-03 19:30:51

标签: java bytecode

如果我有这些文件:

//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”吗?

2 个答案:

答案 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)。