JVM(五) class类文件的结构
概述
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解析
参考资料
JVM(五) class类文件的结构的更多相关文章
- 类文件的结构、JVM 的类加载过程、类加载机制、类加载器、双亲委派模型
一.类文件的结构 我们都知道,各种不同平台的虚拟机,都支持 "字节码 Byte Code" 这种程序存储格式,这构成了 Java 平台无关性的基石.甚至现在平台无关性也开始演变出 ...
- 类文件结构-----Class类文件的结构
①无关性的基石 “与平台无关的”得理想最终实现在操作系统的应用层上:Sun公司和其他虚拟机提供商发布了许多可以在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码,从而实现了程序 ...
- jvm——class类文件的结构
class类文件并不一定以磁盘的形式存在,也可以是由类加载器直接生成的二进制流,他其实是一种数据结构,类似于c语言结构体,这种数据结构只有两种数据类型:无符号数和表. 1.魔数:类似于文件拓展名,CA ...
- Class类文件的结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,中间没有任何分隔符.Class文件的结构只有两种数据类型:无符号数和表.无符号数以u1.u2. ...
- Java类文件的结构
Class文件是以8位字节为基础单位的二进制流,各部分中间没有分隔符.遇到8位字节以上的空间数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储. Class文件采用类似C语言的伪结构体来存储 ...
- JVM虚拟机查找类文件的顺序
JVM查找类文件的顺序: 在doc下使用set classpath=xxx, 如果没有配置classpath环境变量,JVM只在当前目录下查找要运行的类文件. 如果配置了classpath环境,JVM ...
- JVM虚拟机Class类文件研究分析
前言 为了研究Class文件,先编写一个最简单的代码: package com.courage; public class T0100_ByteCode01 { } 之所以说最简单,是因为这个类里面任 ...
- 【JVM.5】类文件结构
鲁迅曾经说过:代码编译的结构从本地机器码转变为字节码,是存储格式发展的一小步,确是编程语言发展的一大步. 一.无关性的基石 Java设计者在最初就承诺过“In the future, we will ...
- JVM-Class文件的结构
Class类文件的结构 Class文件是一株以8个字节为单位的二进制流.各个数据项目严格按照顺序紧凑的排列在文件之中,中间没有任何的分隔符,当遇到占用的空间大于8个字节时,会按照高位在前的方式进行分割 ...
随机推荐
- Tomcat开机启动设置
omcat开机启动设置 1.修改/etc/rc.d/rc.local,使用vi /etc/rc.d/rc.local 命令2.在/etc/rc.d/rc.local文件最后添加下面两行脚本 expor ...
- python 使用跨平台文件锁
#encoding=utf-8 print '中国' #使用跨平台文件锁 import os if os.name == 'nt': import win32con,win32file,pywinty ...
- Mysql内置功能《二》触发器
使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询 一 创建触发器 # 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INS ...
- “全栈2019”Java第二十九章:数组详解(中篇)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
size_t _FindLeafSize(Node* root) //求二叉树叶子节点的个数 { //static size_t count = 0; if ...
- LVM 认知与扩容操作
继上次 "Linux系统如何迁移至LVM磁盘"反响不错,近三百的访问量吧.这次想续写点东西,主要讲的是"LVM认知和扩容操作".因为网上大多数不准确,可能作者也 ...
- ubuntu安装gnome桌面
1. apt install gnome-shell 2. apt install ubuntu-gnome-desktop 3. apt install unity-tweak-tool 4. ap ...
- CocoaPods的PodSpec.json文件用法
最近有时候用最新的CocoaPod的第三方库,有时候发现CocoaPod.org能搜到那个Podfile,但是每次在终端Pod search xxx,每次都搜不到,原来是本地的Podspec没用更新, ...
- image_size must contain 3 elements[4]
今天在制作自己训练集合并且训练的时候,碰见了如下的错: image_size must contain 3 elements[4] 这是因为训练的数据集中不是所有的图片位深都是三通道的. 写一个脚本查 ...
- ModuleNotFoundError: No module named 'Crypto'
pycrypto已经舍弃了使用pycryptodome,pip uninstall pycrypto,然后安装pycryptodome,pip install pycryptodome 可能还需要改名 ...