java虚拟机5 字节码
java字节码本质是java程序的格式化表示,便于机器处理。所以他是java程序的另一种表示,java程序包含的信息他都包含并且更加结构化。
java虚拟机字节码格式:

magic
魔数,标识该文件是一个字节码文件。
minor_version
major_version
字节码的版本号
constant_pool
常量池,存储字节码中的常量数据以及符号引用。常量数据包括有utf8、Integer、float、long、double几种类型。符号引用包括有class、field、method
因为java在编译的时候,不像c有连接的过程,虚拟机加载的时候是动态连接,所以需要存储符号引用以便虚拟机加载的时候进行连接。
access_flags
访问标识。
this_class
类索引,指向一个常量池中的class类型
super_class
父类索引,指向一个常量池中的class类型
interfaces
接口索引,指向多个常量池中的class类型
fields
字段,存储类的字段定义。
methods
方法,存储类的方法定义。
attributes
属性表用于存储class文件、字段、方法的专有信息,如下所示。字段和方法都有自己的属性定义。
cp_info
常量池格式,
| 常量 | 项目 | 类型 | 描述 |
| utf8 | tag | u1 | 1 |
| length | u2 | 字符串字节数 | |
| bytes | u1 | 长度位length的字符串 | |
| integer | tag | u1 | 3 |
| bytes | u4 | int值 | |
| float | tag | u1 | 4 |
| bytes | u4 | float值 | |
| long | tag | u1 | 5 |
| bytes | u8 | long值 | |
| double | tag | u1 | 6 |
| bytes | u8 | double值 | |
| class | tag | u1 | 7 |
| index | u2 | 全限定名常量项索引 | |
| string | tag | u1 | |
| index | u2 | 字符串索引 | |
| fieldref | tag | u1 | 9,代码中引用到的字段 |
| index | u2 | 常量池class引用,表示引用的字段是哪个类的 | |
| index | u2 | 常量池nameAndType引用,表示引用的字段的名称和参数类型 | |
| methodref | tag | u1 | 10,代码中引用到的方法 |
| index | u2 | 常量池class引用,表示引用的方法是哪个类的 | |
| index | u2 | 常量池nameAndType引用,表示引用的方法名和参数类型 | |
| interfaceMethodref | tag | u1 | 11,代码中引用到的接口方法 |
| index | u2 | 常量池class引用,表示引用的方法是哪个接口的 | |
| index | u2 | 常量池nameAndType引用,表示引用的方法名和参数类型 | |
| nameAndType | tag | u1 | 12 |
| index | u2 | 指向utf8常量池,表示名称 | |
| index | u2 | 指向utf8常量池,表示类型 |
field_info
| 类型 | 名称 | 数量 | 说明 |
|
u2 |
access_flags | 1 | 字段修饰符 |
| u2 | name_index | 1 | 字段名,指向常量池字符串项 |
| u2 | descriptor_index | 1 | 字段数据类型,指向常量池字符串项 |
| u2 | attributes_count | 1 | 属性个数 |
| attribute_info | attributes | attributes_count | 属性 |
method_info
| 类型 | 名称 | 数量 | 说明 |
|
u2 |
access_flags | 1 | 方法修饰符 |
| u2 | name_index | 1 | 方法名,指向常量池字符串项 |
| u2 | descriptor_index | 1 | 方法参数和返回值类型,指向常量池字符串项 |
| u2 | attributes_count | 1 | 属性个数 |
| attribute_info | attributes | attributes_count | 属性 |
attribute_info
有一下几种attribute类型。
| 属性名称 | 使用位置 | 含义 |
| code | 方法 | 字节码指令 |
| ConstantValue | 字段 | final定义的常量 |
| Deprecated | 类、方法、字段 | 声名位deprecated的类、字段、方法 |
| Exceptions | 方法 | 方法抛出的异常 |
| InnerClasses | 类 | 内部类列表 |
| LineNumberTable | code | 源码行号欲指令对应关系 |
| LocalVariableTable | code | 方法局部变量 |
| SourceFile | 类 | 原文件名称 |
| Synthetic | 类、方法、字段 | 编译器自动生成 |
code
| 类型 | 名称 | 数量 | 说明 |
| u2 | attribute_name_index | 1 | 指向一个Code的utf8常量池 |
| u4 | attribute_length | 1 | 长度 |
| u2 | max_stack | 1 | 操作数栈最大深度 |
| u2 | max_locals | 1 | 局部变量需要的空间 |
| u4 | code_length | 1 | 代码治理长度 |
| u1 | code | code_length | 方法代码指令 |
| u2 | exception_table_length | 1 | 异常表长度 |
| exception_info | exception_table | exception_table_length | 异常表 |
| u2 | attribute_count | 1 | 属性长度 |
| attribute_info | attribute | attribute_count | 属性 |
exception_info
| 类型 | 名称 | 数量 | 说明 |
| u2 | start_pc | 1 | 开始代码行 |
| u2 | end_pc | 1 | 结束代码行 |
| u2 | handler_pc | 1 | 执行代码行 |
| u2 | catch_type | 1 | 异常类型 |
exception
这里的exception是和code平级的,作用是列举出方法中可能抛出的受查异常,也就是方法throws后面的异常。
| 类型 | 名称 | 数量 | 说明 |
| u2 | attribute_name_index | 1 | 指向一个Exception的utf8常量池 |
| u4 | attribute_length | 1 | 长度 |
| u2 | number_of_exception | 1 | 个数 |
| u2 | exception_index_table | number_of_exception | 指向class的常量池 |
LineNumberTable
描述java源码行号欲字节码行号的对应关系,抛出异常时显示行号。line_number_info包括了start_pc line_number两个u2的数据项,前者是字节码行号,后者是java源码行号。
| 类型 | 名称 | 数量 | 说明 |
| u2 | attribute_name_index | 1 | 指向一个LineNumberTable的utf8常量池 |
| u4 | attribute_length | 1 | 长度 |
| u2 | number_of_table | 1 | 个数 |
| line_number_info | line_number_table | number_of_table | 表 |
java虚拟机5 字节码的更多相关文章
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
- 深入理解Java虚拟机(字节码执行引擎)
深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力, ...
- java编译后字节码解析
java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260
- jbe 可以用来修改Java class的字节码,配合jd-gui 使用
jbe 可以用来修改Java class的字节码,配合jd-gui 使用
- 深入浅出Java探针技术1--基于java agent的字节码增强案例
Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...
- 命令查看java的class字节码文件、verbose、synchronize、javac、javap
查看Java字节码 1 javac –verbose查看运行类是加载了那些jar文件 HelloWorld演示: public class Test { public static void main ...
- Java反射获取字节码以及判断类型
一.获取类的字节码的三种方法: 1.使用Class.class Class<?> c1=String.class; 2.使用实例.getClass() String s= Clas ...
- 命令查看java的class字节码文件
源代码: public class Math { public static void main(String[] args){ int a=1; int b=2; int c=(a+b)*10; } ...
- 尚学堂 216 java中的字节码操作
所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...
随机推荐
- Wireshark中的Checksum: 0x90c5 [validation disabled]问题
Wireshark中的Checksum: 0x90c5 [validation disabled]问题 废话不多说先上问题图: 这是我在做关于DNS协议PPT的时候出现的协议树第五项展开结果,可以发现 ...
- JavaScript学习系列博客_17_JavaScript中的函数的参数、返回值
数的形参(形式参数) - 定义函数时,可以在()中定义一个或多个形参,形参之间使用英文逗号隔开:定义形参就相当于在函数内声明了对应的变量但是并不赋值,形参会在调用时才赋值. 函数的实参(实际参数) - ...
- 要点4:C的文件操作
关于文件操作个人比较困惑的地方有两点: 关于w和wb的区别 如何定位文件的读写位置 文件格式和打开模式 c中的文件打开模式分为:文本模式和二进制模式,分别处理文本格式文件和二进制格式文件. 两个模式的 ...
- 区块链入门到实战(36)之Solidity – 运算符
Solidity – 算术运算符 Solidity 支持的算术运算符,如下表所示: 假设变量A的值为10,变量B的值为20. 序号 运算符与描述 1 + (加)求和例: A + B = 30 2 – ...
- 区块链入门到实战(17)之以太坊(Ethereum) – 是什么
以太坊的作用:构建基于区块链的分布式应用. 以太坊是什么:可编程的虚拟币. 以太坊(Ethereum)是一个可编程的虚拟币,它是一个基于公共区块链的分布式计算平台,可用于构建基于区块链的分布式应用. ...
- 【转】Echarts 数据绑定
Echarts 数据绑定 简单的统计表已经可以生成,不过之前图标数据都是直接写在参数里面的,而实际使用中,我们的数据一般都是异步读取的.EChart.js对于数据异步读取这块提供了异步加载的方法. 绑 ...
- Cortex-M4的快速memcpy,根据数据对齐情况自动优化,速度为普通memcpy的1.3到5.2倍
代码:https://github.com/gamesun/memcpy_fast memcpy_fast与memcpy速度比较 测试方法 memcpy_fast(dest + a, src + b, ...
- day42:HTML标签和CSS选择器
目录 1.HTML 1.1 文档结构 1.2 head标签 1.3 body标签 1.3.1 h1-h6标签 1.3.2.br标签:换行 1.3.3.hr标签:一行横线 1.3.4 a标签:超链接标签 ...
- unity shader
Unity新的shader叫做 基于物理渲染的shader,先介绍下新的shader具有的特性: Energy Conservation(能量守恒):这是一个基于物理的概念,它确保物体反射的光线不会比 ...
- 深入了解Netty【三】Netty概述
1.简介 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,它支持快速.简单地开发协议服务器和客户端等网络应用程序 ...