1.Class文件基础
(1)文件格式
Class文件的结构不像XML等描述语言那样松散自由。由于它没有任何分隔符号,
所以,以上数据项无论是顺序还是数量都是被严格限定的。哪个字节代表什么
含义,长度是多少,先后顺序如何,都不允许改变。
(2)数据类型
仔细观察上面的Class文件格式,可以看出Class文件格式采用一种类似于C语言
结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表。
无符号数就是u1、u2、u4、u8来分别代表1个、2个、4个、8个字节。表是由
多个无符号数或其他表构成的复合数据类型,以“_info”结尾。在表开始位置,
通常会使用一个前置的容量计数器,因为表通常要描述数量不定的多个数据。
下图表示的就是Class文件格式中按顺序各个数据项的类型:
(3)兼容性
高版本的JDK能向下兼容以前版本的Class文件,但不能运行以后版本的Class文件,
即使文件格式未发生任何变化。举例来说,JDK 1.7中的JRE能够执行JDK 1.5编译
出的Class文件,但是JDK 1.7编译出来的Class文件不能被JDK 1.5使用。这就是
target参数的用处,可以在使用JDK 1.7编译时指定-target 1.5。
2.一个简单的例子
packagecom.cdai.jvm.bytecode;
publicclassByteCodeSample {
privateString msg ="hello world";
publicvoidsay() {
System.out.println(msg);
}
}
package com.cdai.jvm.bytecode;
public class ByteCodeSample {
private String msg = "hello world";
public void say() {
System.out.println(msg);
}
}
编译成Class文件后的样子:
3.逐个字节分析
(1)魔数和版本号