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 异常表长度
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 字节码的更多相关文章

  1. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  2. 深入理解Java虚拟机(字节码执行引擎)

    深入理解Java虚拟机(字节码执行引擎) 本文首发于微信公众号:BaronTalk 执行引擎是 Java 虚拟机最核心的组成部分之一.「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力, ...

  3. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  4. jbe 可以用来修改Java class的字节码,配合jd-gui 使用

    jbe  可以用来修改Java class的字节码,配合jd-gui 使用

  5. 深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  6. 命令查看java的class字节码文件、verbose、synchronize、javac、javap

    查看Java字节码 1 javac –verbose查看运行类是加载了那些jar文件 HelloWorld演示: public class Test { public static void main ...

  7. Java反射获取字节码以及判断类型

    一.获取类的字节码的三种方法: 1.使用Class.class   Class<?> c1=String.class; 2.使用实例.getClass()   String s= Clas ...

  8. 命令查看java的class字节码文件

    源代码: public class Math { public static void main(String[] args){ int a=1; int b=2; int c=(a+b)*10; } ...

  9. 尚学堂 216 java中的字节码操作

    所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...

随机推荐

  1. 基础知识、DOS命令

    一.信息安全 1.信息源认证   https 访问控制   ACL   :不能有非法软件驻留   :不能含有未授权的操作等 2.2017-OWASP-TOP5 注入  :失效的身份认证和回话配置 :跨 ...

  2. Java之reflection(反射机制)——通过反射操作泛型,注解

    一.反射操作泛型(Generic) Java采用泛型擦除机制来引入泛型.Java中的泛型仅仅是给编译器Javac使用的,确保数据的安全性和免去强制类型转换的麻烦.但是编译一旦完成,所有和泛型有关的类型 ...

  3. Clickhouse单机及集群部署详解

    一.ClickHouse简介 ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域.目前国内社区火热,各个大厂纷纷跟进大规模使用: 今日头条 内部用ClickHous ...

  4. 超详细的阿里字节Spring面试技术点总结(建议收藏)

    前言 Spring作为现在最流行Java开发技术,其内部源码设计非常优秀. Spring这个词对于Java开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务.现在很多 ...

  5. 数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树

    树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和. n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+… 带权路径长度=根结点到任意结点的路径长度*该结点 ...

  6. Nuxt.js 踩坑记录(3) Net.connection xxxx

    浏览器报的是Net.connection啥的错误 项目运行时报错这个 [HPM] Error occurred while trying to proxy request article from l ...

  7. ASP.NET Core 3.1 WebAPI的跨域问题

    1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...

  8. SPFA算法详解

    前置知识:Bellman-Ford算法 前排提示:SPFA算法非常容易被卡出翔.所以如果不是图中有负权边,尽量使用Dijkstra!(Dijkstra算法不能能处理负权边,但SPFA能) 前排提示*2 ...

  9. vue实现pdf文件的在线预览

    我是通过 <iframe> 标签就可以满足我工作的 pdf预览需求 如果<iframe> 无法满足需求 , 可以使用pdf.js这个插件,功能强大. <iframe :s ...

  10. Fitness - 07.07

    倒计时177天 运动53分钟,共计8组半,5.5公里.拉伸5分钟. 每组跑步5分钟(6.5KM/h),走路1分钟(5.5KM/h). 感冒+姨妈耽搁了大半月的时间 终于进入第六周的训练了~~!加油~! ...