结构如下:
magic: class:文件的特定前缀,值为CAFEBABE
minor_version:小版本号
major_version:大版本号
constant_pool_count:常量池数量
constant_pool:常量池中的各种值
access_flags:class:访问标志 如 priviate public static 等
this_class:类索引(在常量池中的索引)
super_class:父类索引(常量池)无父类的class的父类是Object
interfaces_count:接口集合数
interfaces:接口索引
field_count:字段数
fields:字段
method_count:方法数
method:方法
attribute_count:属性数
attribute:属性
几个表:
常量池中的14中常量项的结构总表
描述符标识字符含义
字段表结构
字段修饰(字段访问标志)
方法表结构
方法访问标志
Code属性表的结构
LineNumberTable属性结构
例子:
package com.wjw334; public class TestClass { private int m; public int inc() { return m + 1; } }
编译成class的二进制
分解:
CA FE BA BE //magic
00 00 00 33 //version 51 是java 1.7
--------------常量池--------------------
00 13 //常量池中的数量共19个 (无0索引,从索引1开始)
0A 00 04 00 0F //方法,名称为第4个常量,返回值和类型为第15个常量
09 00 03 00 10 //字段,名称为第3个常量,返回值和类型为第16个常量
07 00 11 // 类,类名为第17个常量
07 00 12 // 类,类名为第18个常量
01 00 01 6D //字符常量 m
01 00 01 49 //字符常量 I
01 00 06 3C 69 6E 69 74 3E // 字符常量 <init>
01 00 03 28 29 56 // 字符常量 ()V ,表示无参数返回类型是void 的方法
01 00 04 43 6F 64 65 // 字符常量Code,是class属性之一,表示方法体
01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6c 65 //字符常量 LineNumberTable 是class属性之一,表示 性用于描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系。
01 00 03 69 6E 63 //字符常量 inc 方法名字
01 00 03 28 29 49 //字符常量 ()I,表示无参数返回类型是Integer的方法.
01 00 0A 53 6F 75 72 63 65 46 69 6C 65 //字符常量 SourceFile ,是class属性之一,
01 00 0E 54 65 73 74 43 6C 61 73 73 2E 6A 61 76 61 // 字符常量 TestClass.java
0C 00 07 00 08 0C 00 05 00 06 //
01 00 14 63 ....6C 61 73 73//字符常量 ,com/wjw334/TestClass
01 00 10 6A ...6A 65 63 74 // 字符常量 ,java/lang/Object
--------------常量池完--------------------
00 21 // 访问标志
00 03 // class 索引
00 04 // super class 索引
00 00 //接口集合为空
00 01 // 字段数
00 02 // 字段修饰 private
00 05 // 字段名字索引 第五个常量为 m 即 字段名字 m
00 06 // 字段描述索引 第六个常量为 I 即类型为int
00 00 // 字段属性数量
00 02 // 方法数量为2个方法(默认一个为构造方法)
-------------------------第1个方法开始--------------------
00 01 // 方法修饰 public
00 07 // 方法名字索引 第七个常量 <init>
00 08 // 方法描述 第八个常量 ()V,表示无参数返回类型是void 的方法
00 01 // 方法数为1
00 09 //方法属性索引 为第九个常量 Code
00 00 00 1D // 属性表的长度
00 01 //max_stack 最大栈深度
00 01 //max_locals 最大内存分配单元
00 00 00 05 // code_length
2A B7 00 01 B1 // code
00 00 // exception_table_length
00 01 // init 方法属性数量
00 0A //init 方法属性索引 第十个常量 LineNumberTable 源码行号与字节码行号(字节码的偏移量)之间的对应关系
00 00 00 06 // 属性长度 字节数
00 01 //行数 1行
00 00 //字节码行号
00 03 // 源代码行号
--------------------------第1个方法完--------------------
--------------------------第2个方法--------------------
00 01 // 方法修饰 public
00 0B // 方法名字索引 第11个常量 inc
00 0C // 方法描述 第12个常量 ()I,表示无参数返回类型是int 的方法
00 01 // 方法属性为1
00 09 //方法属性索引 为第九个常量 Code
00 00 00 1F // 属性表的长度
00 02 //max_stack 最大栈深度
00 01 //max_locals 最大内存分配单元
00 00 00 07 // code_length 7个字节
2A B4 00 02 04 60 AC // code
00 00 // exception_table_length
00 01 // inc 方法属性数量
00 0A //inc 方法属性索引 第十个常量 LineNumberTable 源码行号与字节码行号(字节码的偏移量)之间的对应关系
00 00 00 06 // 属性长度 字节数
00 01 //行数 1行
00 00 //字节码行号
00 07 // 源代码行号
--------------------------第2个方法--------------------
--------------------------class文件属性----------------
00 01 //属性数量为1
00 0D // 属性名称索引 第13个常量 SourceFile
00 00 00 02 //属性长度
00 0E //属性索引 第14个常量 TestClass.java
--------------------------class文件属性完----------------
另一个例子:
http://net.anquan365.com/Web/Jsp/201310/175244.html
概括说:组成如下
magic cafebabe
version 包括大小版本号
常量池
类信息 修饰符,父类,接口
字段
方法
class文件属性 如:class文件名字