字节代码一般出现在Java源代码编译之后生成的class文件中。每个class文件中包含了单个类或接口的定义。Java源文件中的内部类会被编译到单独的class文件中。实际上字节代码并不是只存在于class文件中,还可以通过网络从远程服务器下载,或者有程序在运行时动态生成。所以字节码代更加准确的说法是包含单个Java类或接口定义的字节流,通常用byte[]来表示。
字节代码是一种二进制格式,其具体的格式在Java虚拟机中定义。使用二进制编辑器打开一个class文件,可以看到字节代码的内容。要理解字节代码格式,可以参考对应的Java源代码的组织结构。一个Java类从源代码的角度来说,包含类本身的信息及类中包含的域和方法信息。字节代码中也包含了同样的信息,并且以松散的结构进行组织。为了节省空间,字节代码对Java类中的常量储存进行了优化。了解字节代码的格式,是对字节代码进行操作的基础。工具无法为开发人员屏蔽与字节代码相关的所有细节。
基本类型在字节代码中用一个字符来表示:byte、char、double、float、int、long、short和boolean类型对应的字符分别是B、C、D、F、I、J、S和Z。
对象类型的表示方法是在全民上加上“L”前缀和“;”后缀。例如,一个String类型的域描述符是“Ljava/lang/String;”。
数组类型的表示形式是在其元素类型之前加上“[”作为前缀。“[”的个数表示数组的维度。
对于一个方法来说,它的描述取决于参数和返回值的类型,基本形式是“(参数类型)返回值类型“。如果返回值是void,则用”V“表示。