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

时间: 2024-08-01 11:17:00

class结构的相关文章

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

linux命令格式,获取帮助及其目录结构简要理解

我们都知道,一台计算机要是没通电,和一堆废铁没什么区别.那么,通电开机进入系统后,会进入交互界面,等待用户操作,人与计算机交互界面有两种: GUI:图形用户接口.如我们平时使用的Windows  ,linux的X window,有KDE和GOME. CLI:命令行接口,使用的SHELL类型有bash ,csh,tcshell,zshell等. 例如:[[email protected] ~]# commandbin root:当前登录的用户名. dxlcentOS:当前主机的主机名.@是一个分隔

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

passwd、shadow、group结构及各字段含义

/etc/password结构 sample:root:x:0:0:root:/root:/bin/bash 账号名称 密码 UID GID 用户信息说明 家目录 Shell root x 0 0 root /root /bin/bash /etc/shadow结构: sample:root:$1$/30QpE5e$y9N/D0bh6rAACBEz.hqo00:14126:0:99999:7::: 账号名称 密码 最近更动密码的日期 密码不可被更动的天(0代表随时可以变动) 密码需要重新变更的天

JS中的运算符&amp;JS中的分支结构

一.JS中的运算符 1.算术运算(单目运算符) + 加.- 减.* 乘./ 除.% 取余.++ 自增.-- 自减 >>> +:有两种作用,连接字符串/加法运算.当+两边全为数字时,进行加法运算: 当+两边有任意一边为字符串时,起连接字符串的作用,连接之后的结果为字符串 除+外,其余符号运算时,会先尝试将左右变量用Number函数转为数字 >>> /: 结果会保留小数点 >>> ++: 自增运算符,将变量在原有基础上+1: --: 自减运算符,将变量在原

线性结构的常见应用之一 队列

定义:一种可以实现"先进先出"的存储结构 分类 链式队列 --  用链表实现 静态队列 --  用数组实现 静态队列通常都必须是循环队列 循环队列的讲解: 1.静态队列为什么必须是循环队列 2.循环队列需要几个参数来确定   需要两个参数来进行确定:front   rear 3.循环队列各个参数的含义 2个参数在不同的场合有不同的含义 建议初学者先记住,后面再想 1).队列初始化 front 和 rear 的值都是零 2).队列非空 front 代表的是队列的第一个元素 rear 代表

java-分支结构(四种基本分支结构的认识)

分支结构:有条件的执行某语句,并非每句必走 1)if结构:1条路 2)if...else结构:2条路 3)if...else if结构:多条路 4)switch...case结构:多条路 优点:效率高.结构清晰 缺点:整数.相等 break:跳出switch 一.if结构的认识 /* * 1.if结构:1条路 * 1)语法: * if(boolean){ * 语句块 * } * 2)执行过程: * 判断boolean的值: * 若为true,则执行语句块 * 若为false,则不执行语句块 */

选择结构if语句和switch语句的区别

1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fals

SQL SERVER大话存储结构(5)

阅读目录(Content) 1 基本介绍 2 对数据库启动的影响 3 日志文件添加方式 4 物理结构 5 延迟日志截断原因 6 管理事务日志 本系列上一篇博文链接:SQL SERVER大话存储结构(4)_复合索引与包含索引 回到顶部(go to top) 1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行日志备份. 大容量日志模式,适用于批量操作的

顺序结构显示日期与时间

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms; namespace 顺序结构时间日期{ public partial class Form1 : Form { public Form1() {