magic[4字节] 魔数,用来判断是否可以被虚拟机使用。固定值为0xCAFEBABE(咖啡宝贝)
minor_version[2字节] 次版本号
major_version[2字节] 主版本号,低版本的jdk无法执行高版本的class文件。
constant_pool_count[2字节] 常量池里的项目个数
constant_pool 常量池里每一个项目类型都用一个tag标示。从1开始取值,比如取值为1时,表示info里存放的是utf8的字符串
  tag[1字节] 不同的取值,决定了其下info的结构不同
  info
access_flags[2字节] 类的访问标识位,用来标识类是否具有pulbic/abstract/interface/final等修饰符。用其中的bit位标识是否存在。例如,如果是public的class,其值为0x0001
this_class[2字节] 两个字节的数值,指向常量池里的某一个项目。这里指向的是当前类的全名称
super_class[2字节] 指向常量池里的当前类的父类全名称
interfaces_count[2字节] 当前类实现的接口个数
interfaces 每一个指向常量池里的接口的全名称

fields_count[2字节] 当前类的成员变量个数
fields 成员变量信息
  access_flags[2字节] 成员变量的访问标识,与上边access_flags相似
  name_index[2字节] 指向常量池里当前字段的名字
  desc_index[2字节] 指向常量池里当前字段的描述。例如字符串类型对应的描述是'Ljava.lang.String;'
  attribute_count[4字节] 字段的属性表个数,跟类的属性表类似。在下面介绍
  attributes 存放字段的属性信息

methods_count[2字节] 当前类的成员方法个数
mehtods 成员方法信息
  access_flags[2字节] 成员方法的访问标识,与上边access_flags相似
  name_index[2字节] 指向常量池里当前方法的名字
  desc_index[2字节] 指向常量池里当前方法的签名。比如 public String test(Object o) 方法对应描述是(Ljava.lang.Object;)Ljava.lang.String;
  attributes_count[4字节] 方法的属性表个数,跟类的属性表类似。在下面介绍
  attributes 存放方法的属性信息,最重要的属性就是Code,存放了方法的字节码指令

attributes_count[2字节] 类的属性表个数
attributes 类的属性信息
  attribute_name_index[2字节] 指向常量池里属性的名称
  attribute_length[4字节] 下边info内容的长度
  info 属性的内容。不同的属性,内容结构不同

以Code属性表为例,其结构如下
attribute_name_index[2字节] 指向常量池里的Code字符串
attribute_length[4字节] 该属性的长度
max_stack[2字节] 当前方法操作数栈的最大深度
max_locals[2字节] 存放局部变量所需要的空间个数
code_length[4字节] 源码编译后字节码指令的长度
code 字节码指令
exception_table_length 异常表个数
exception_table 异常表
attributes_count 当前属性下的属性个数
attributes

从上边的结构我们不难看出,其实Java class文件的各是还是比较简洁的。其中的attributes可以根据需要随时添加,用来满足Jvm后期发展的需求。

Java Class文件格式详解的更多相关文章

  1. Android逆向之旅---SO(ELF)文件格式详解(转)

    第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦 ...

  2. Android逆向之旅---SO(ELF)文件格式详解

    第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦 ...

  3. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  4. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  5. Java String类详解

    Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...

  6. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

  7. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  8. 转:Java HashMap实现详解

    Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述:    HashMap是基于哈希表的M ...

  9. 淘宝JAVA中间件Diamond详解(2)-原理介绍

    淘宝JAVA中间件Diamond详解(二)---原理介绍 大家好,通过第一篇的快速使用,大家已经对diamond有了一个基本的了解.本次为大家带来的是diamond核心原理的介绍,主要包括server ...

随机推荐

  1. Loadrunner11不能调用IE8解决方法大全

    刚安装了英文版的Loadrunner 11, 用的是IE8, 开始录制时没有启动IE, 试了网上很多的方法,最终解决了问题.总结一般产生问题的原因如下. 1.当你主机上有多个浏览器时,loadrunn ...

  2. 常见的if语句shell脚本

    常见的if语句shell脚本 author :headsen  chen  2017-10-17  15:00:07 1,cat if.sh 2, cat  if2.sh

  3. Linux系统命令归纳

    常规操作命令: # netstat -atunpl |egrep "mysql|nginx"# vimdiff php.ini*# runlevel# rpm -e httpd - ...

  4. iTerm2设置及使用

    1. 安装 iTerm2 下载地址:https://www.iterm2.com/downloads.html 下载的是压缩文件,解压后是执行程序文件,你可以直接双击,或者直接将它拖到 Applica ...

  5. Redis的事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

  6. WPF笔记1 用VS2015创建WPF程序

    使用WPF创建第一个应用程序.实现功能如下: 单击"Red"按钮,文本显示红色:单击"Black"按钮,文本显示黑色:单击"Back"按钮, ...

  7. redis存取对象

    redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis不能直接存取对象,如何解决呢? 两种方式 1.利用序列化和反序列化的方式 两层对 ...

  8. 基于php编写的新闻类爬虫,插入WordPress数据库

    这个爬虫写的比较久远,很久没有更新博客了. 1.首先思路是:通过php的curl_setopt()函数可以方便快捷的抓取网页. 2.什么样的新闻吸引人呢,当然的热点新闻了.这里选百度的搜索风云榜,获取 ...

  9. Java创建线程的三种方式

    一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实 ...

  10. 原生js封装添加class,删除class

    一.添加class function addClass(ele,cName) { var arr = ele.className.split(' ').concat(cName.split(" ...