概述

class类文件的结构可见下面这样图(出处见参考资料),可以参照下面的例子,对应十六进制码,找出找出相应的信息。

其中u2 , u4 表示的意思是占用两个字节和占用四个字节,下面我们将会各项说明。

class类文件结构

Class 文件是一组以8 字节位单位的二进制流,各个数据按照一定的顺序排放,Class文件采用一种类似于C语言结构体的伪结构来存储数据。

例如下面代码使用java编译后,生成的class 文件。

public class TestClass {
private int m;
private int inc(){
return m+1;
}
}
 
 
cafe babe 0000 0034 0013 0a00 0400 0f09
0003 0010 0700 1107 0012 0100 016d 0100
0149 0100 063c 696e 6974 3e01 0003 2829
5601 0004 436f 6465 0100 0f4c 696e 654e
756d 6265 7254 6162 6c65 0100 0369 6e63
0100 0328 2949 0100 0a53 6f75 7263 6546
696c 6501 000e 5465 7374 436c 6173 732e
6a61 7661 0c00 0700 080c 0005 0006 0100
0954 6573 7443 6c61 7373 0100 106a 6176
612f 6c61 6e67 2f4f 626a 6563 7400 2100
0300 0400 0000 0100 0200 0500 0600 0000
0200 0100 0700 0800 0100 0900 0000 1d00
0100 0100 0000 052a b700 01b1 0000 0001
000a 0000 0006 0001 0000 0001 0002 000b
000c 0001 0009 0000 001f 0002 0001 0000
0007 2ab4 0002 0460 ac00 0000 0100 0a00
0000 0600 0100 0000 0400 0100 0d00 0000
0200 0e

在概述中我们已经给出了,class类文件的文件结构,各个项在上图可以对应到。文章没有给出详细的各项结构,需要详细地了解各个项的数据结构可以到官网查看。

下面介绍各个项所代表的含义和信息。

magic

唯一的作用就是识别是否是JVM 可以执行的文件,class文件的魔术为16进制的“CAFE BABE”,这让人不禁想起java图标上那杯咖啡。

minor_version 和 major_version

作用就是识别该class 是否适合该JVM 执行。

constant_pool_count 和 cp_info

常量池中常量数量和各项常量,各项常量的格式是不同的

access_flags

用于标识一些类或者接口层次的访问信息,包括 : 这个class 是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final 等。

this_class super_class 和 interfaces_count interfaces[interfaces_count]

this_class 用于确定这个类的全限定名,super_class 用于确定这个类的父类的全限定名;
    interface  用于确定这个类继承的接口

fields_count   fileds[fields_count]

字段表用于描述接库或者类中声明的变量。字段包括类级变量(static 修饰)和以及实例级变量,但不包括方法内声明的局部变量。

methods_count   和   methods[methods_count]

用来描述该类各个方法的。

attributes_count   attributes[atttributes_count]

在class文件,字段表,方法表都可以携带自己的属性表集合,和具体值放在常量池,而持有一个index这种的方式相同,attribute存放的是具体值,而字段表,或是方法表持有attribute index 就可以了,attribute (属性)以用于描述某些场景专有的信息。

下图为 Code 属性的结构。

可以看到Code属性有个名称为code的项,里面放的就是我们代码转化成的字节码,例如方法里的逻辑等。

javap 指令

javap命令的作用是可以反汇编类文件。

The javap command disassembles one or more class files. Its output depends on the options used. If no options are used, javap prints out the package, protected, and public fields and methods of the classes passed to it. javap prints its output to stdout.

解析的内容可以看这一篇文章 : javap解析

参考资料

最新文章

  1. hdu 4859 海岸线 Bestcoder Round 1
  2. 8款唯美设计的HTML5/CSS3应用
  3. java jvm学习笔记十三(jvm基本结构)
  4. linux 访问windows共享
  5. servlet向ajax传递list数据类型,ajax向servlet传递array数据类型
  6. HDU 1532 Drainage Ditches 最大流 (Edmonds_Karp)
  7. GDB踪函数的完整调用过程 及原理
  8. hdu4283(区间dp)
  9. 什么是dtd文件,为什么需要
  10. 简易RPC框架-上下文
  11. cpci热插拔信号
  12. Service Worker 离线无法缓存Post请求的问题解决
  13. how find out what is causing Visual Studio to think each project is out of date
  14. c# Unicode 转换 ASCII
  15. Java中的split函数拆分后变成null的问题
  16. HDU 4825 Xor Sum(01字典树入门题)
  17. 【转】Hudson插件Email-Ext邮件模板时间格式化的解决方法
  18. 成都Uber优步司机奖励政策(4月24日)
  19. VBA学习笔记(4)--数组和单元格互相转换
  20. 【BZOJ】1655: [Usaco2006 Jan] Dollar Dayz 奶牛商店(背包+高精度)

热门文章

  1. UVA 10881
  2. 9、select 语句
  3. Python 验证码识别(别干坏事哦...)
  4. [ActionScript 3.0] flash中的颜色
  5. TCP的成块数据流
  6. 使用Mondrian Virtual OLAP Cube 实现星座模型并在saiku展现分析
  7. NavigatorIOS
  8. Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
  9. leetcode 53 最大子序列之和(动态规划)
  10. POJ - 1821 单调队列优化DP + 部分笔记