class结构

 

结构如下:

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文件名字

 

posted on 2015-03-09 17:23  wjw334  阅读(255)  评论(0编辑  收藏  举报

导航