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

  • 相关阅读:
    iPerf 笔记
    Monkey相关参数 笔记
    adb相关指令 笔记
    Linux常用命令 笔记
    eclipse配置android开发环境并搭建第一个helloWord工程
    python + eclipse + pydev 安装、配置
    print带参数格式
    JS获取按下的键盘字符
    Mysql 创建用户并对其赋予操作权限
    扩展内置对象
  • 原文地址:https://www.cnblogs.com/wjw334/p/4324063.html
Copyright © 2020-2023  润新知