原创

Java字节码文件解析分析

1.Java字节码文件分析

a.java文件

public class B {

    private String a;
    private Integer b;

    public void setA(String a) {
        this.a = a;
    }
}

javac编译a.java

a.class文件打开 是一堆16进制的字节

cafe babe 0000 0032 0015 0a00 0400 1109
0003 0012 0700 1307 0014 0100 0161 0100
124c 6a61 7661 2f6c 616e 672f 5374 7269
6e67 3b01 0001 6201 0013 4c6a 6176 612f
6c61 6e67 2f49 6e74 6567 6572 3b01 0006
3c69 6e69 743e 0100 0328 2956 0100 0443
6f64 6501 000f 4c69 6e65 4e75 6d62 6572
5461 626c 6501 0004 7365 7441 0100 1528
4c6a 6176 612f 6c61 6e67 2f53 7472 696e
673b 2956 0100 0a53 6f75 7263 6546 696c
6501 0006 422e 6a61 7661 0c00 0900 0a0c
0005 0006 0100 056c 7368 2f42 0100 106a
6176 612f 6c61 6e67 2f4f 626a 6563 7400
2100 0300 0400 0000 0200 0200 0500 0600
0000 0200 0700 0800 0000 0200 0100 0900
0a00 0100 0b00 0000 1d00 0100 0100 0000
052a b700 01b1 0000 0001 000c 0000 0006
0001 0000 0008 0001 000d 000e 0001 000b
0000 0022 0002 0002 0000 0006 2a2b b500
02b1 0000 0001 000c 0000 000a 0002 0000
000e 0005 000f 0001 000f 0000 0002 0010
  1. cafe babe 为魔数,class文件的初始标识
  2. 0000 0032分别为此版本号,主版本号
  3. 0015常量池入口,因此该16进制是21,表示有20项常量,往下解析20个常量
  4. 常量解析完就到了Access_Flag 访问标志

2.总结

1.在class字节码文件中 每一个16进制所在的顺序位置不同 16进制对应的数值代表的含义也不同
2.比如,魔数后面就是次版本号,主版本号后面的16进制数就代表常量池常量数
3.常量解析完了 就是Access_Flag 访问标志,每个16进制代表的标识也是不同的,
4.根据16进制解析出对应的class中的类型,然后再根据class中的类型对应的java文件中的类型得到反编译之后的java源码
5.比如java中的boolean在class中用Z表示,int用I ,long用J对应
6.java中声明方法void m(int i,float f) 对应class文件中声明为 (IF)V

如果有理解不全的地方,欢迎一起讨论改进

正文到此结束
本文目录