继续上一次【https://www.cnblogs.com/webor2006/p/9459681.html】的字节码分析,这次来分析一下最为复杂的方法表的信息,如下:

而上一次分析到了属性表的位置在:

接着来看一下方法表相关的信息:

所以往下找两个字节:

因为有一个编译器为其生成的一个构造方法,这时咱们对照着上一次介绍的jclasslib工具来对照一下:

接着往下则是方法表相关的信息:

先来看一下表结构:

也就是说每个方法所对应的方法表结构如上,所以接下来看一下第一个方法的信息,往下数2个字节则是access_flags,如下:

那它对应哪个访问标志则需要查一下:

表示是public的方法,接下来四个字节为方法名字和索引和描述符的索引,一起看:

其对应的常量池信息如下:

也就是第一个方法是构造方法,接着往下则是方法的属性相关的东东,注意:这个属性跟方法的变量是两码事,如下:

所以往下数两个字节,看一下方法属性的个数:

说明有一个方法属性,而往后两个字节对是属性名称索引,如下:

对应常量池:

Code属性,对于每一个方法都有一个Code属性,如下:

{
public com.jvm.bytecode.MyTest1();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #2 // Field a:I
9: return
LineNumberTable:
line 3: 0
line 4: 4
LocalVariableTable:
Start Length Slot Name Signature
0 10 0 this Lcom/jvm/bytecode/MyTest1; public int getA();
descriptor: ()I
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: getfield #2 // Field a:I
4: ireturn
LineNumberTable:
line 7: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/jvm/bytecode/MyTest1; public void setA(int);
descriptor: (I)V
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: iload_1
2: putfield #2 // Field a:I
5: return
LineNumberTable:
line 11: 0
line 12: 5
LocalVariableTable:
Start Length Slot Name Signature
0 6 0 this Lcom/jvm/bytecode/MyTest1;
0 6 1 a I
}
SourceFile: "MyTest1.java"

其实就是描述了整个方法的Code信息,Code attribute的作用是保存该方法的结构,如所对应的字节码:

其中attribute_name_index则是属性名的索引,也就是Code,接下来还有一些信息下面来解释一下:

  • attribute_length表示attribute所包含的字节数,不包含attribute_name_index和attribute_length字段。

    说的是什么意思呢?比如attribute_length=50个字节,则是指往后的50个字节则为整个Code属性的信息,所以往后先数4个字节咱们来看一看长度:

    也就是说属性的长度为56,所以往后56个字节则为具体Code属性的信息,如下:

    那咱们来jclasslib中来确认一下是否也是显示的56个字节,如下:

  • max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度。

    也就是在上面56个字节从头数2个字节,则是这个操作数栈的最大深度,咱们来看一下:

    也就是最大的深度为2。如javap -verbose所示:

  • max_locals表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。

    再继续读2个字节:

    也就是局部变量的数目为1,如javap -verbose所示:

  • code_length表示该方法所包含的字节码的字节数以及具体的指令码。具体指令码既是该方法被调用时,虚拟机所执行的字节码。

    也就是占10个字节,所以往后数10个字节:

    其实这10个字节是对应在jclasslib中的代码助记符的信息,如下:

    呃~~助记符能跟字符信息对应上?这不是扯淡么~~其实它们之间是有一些对应关系的,具体怎么对应下回再来探讨。

Java字节码方法表结构深度剖析的更多相关文章

  1. Java字节码方法表与属性表深度剖析

    方法表: 在上一次咱们已经分析到了字段信息了,如下: 紧接着就是方法相关的信息了: 而它展开之后的结构为: 所以往后数2个字节,看一下方法的总数: 3个方法,可咱们只定义了两个方法呀: 因为编译器会为 ...

  2. JVM Java字节码方法表与属性

    方法表 1.methods_count  method_info,前三个字段和field_info一样 2.方法的属性结构 方法中的每个属性都是一个attribut_info结构 JVM定义了部分at ...

  3. Java字节码方法表与属性表详解

    继续跟着上一次[https://www.cnblogs.com/webor2006/p/9502507.html]的那10个代表code的字节分析,如下: 而这些字节其实对应的信息是它: 所以问题就来 ...

  4. Java字节码深度剖析

    Java字节码文件查看 我们有一个类Test01,具体内容如下: package bytecode; public class Test01 { private int i = 0; public i ...

  5. Java字节码常量池深入剖析

    继续来分析Java字节码,上一节分析了魔数的规则,接下来继续往下分析,其上次总结的规则也一起贴出来: 1.使用javap -verbose命令分析一个字节码文件时,将会分析该字节码文件的魔数.版本号. ...

  6. OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构

    最近在看OpenJDK源码的过程中,顺便看了Java编译器(javac)的源码. 为了理解javac的源码,需要先搞懂Java字节码文件(.class)的结构. 于是,我就认真看了下OpenJDK中J ...

  7. Java字节码文件结构剖析

    今天起开启JVM的新的知识学习篇章----Java的字节码,那学习Java字节码有啥用呢?我们知道Java是跨平台的一门语言,编写一次到处运行,而支撑着这个特性的根基为两点:JVM和.class字节码 ...

  8. JVM 内部原理(六)— Java 字节码基础之一

    JVM 内部原理(六)- Java 字节码基础之一 介绍 版本:Java SE 7 为什么需要了解 Java 字节码? 无论你是一名 Java 开发者.架构师.CxO 还是智能手机的普通用户,Java ...

  9. 大话+图说:Java字节码指令——只为让你懂

    前言 随着Java开发技术不断被推到新的高度,对于Java程序员来讲越来越需要具备对更深入的基础性技术的理解,比如Java字节码指令.不然,可能很难深入理解一些时下的新框架.新技术,盲目一味追新也会越 ...

随机推荐

  1. 渡鸦币(Raven)钱包交叉编译详解

    1 环境准备 1.1 准备Ubuntu 准备虚拟机或物理机,操作系统为Ubuntu 16.04 1.2 安装Mingw sudo apt-get install g++-mingw-w64-i686 ...

  2. vue中的$attrs属性和inheritAttrs属性

    一.vue中,默认情况下,调用组件时,传入一些没有在props中定义的属性,会把这些“非法”属性渲染在组件的根元素上(有一些属性除外),而这些“非法”的属性会记录在$attrs属性上. 二.如何控制不 ...

  3. H5本地存储(转)

    H5本地存储  一.本地存储由来的背景         众所周知Html4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是 ...

  4. spring cloud 快速搭建

    1.首先新建一个普通maven工程 项目名自定义都可以 2.然后在maven工程下新建一个基于spring boot 的module 为注册中心,勾选Eureka的配置,在启动类上面加注解@Enabl ...

  5. 工作总结--CTO(张王岩)IO的正式使用

    4个抽象类 InputStreawm int read()  void close() OutputStream void write(int) void flush() void close() R ...

  6. Detect cycle in a directed graph

    Question: Detect cycle in a directed graph Answer: Depth First Traversal can be used to detect cycle ...

  7. jmeter XLSX 读取

    import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFSheet; i ...

  8. 【C++札记】类的分离式写法

    介绍 类的分离式写法,使得代码更加规范,增强了阅读性. 分离式写法的规则: 1.类的变量:写在类的里面 2.成员函数:类中写函数的声明,函数的定义写在类体外. 3.写在类外函数定义时,类名前加限定(O ...

  9. python可变类型与不可变类型

    一.可变类型与不可变类型的特点 1.不可变数据类型 不可变数据类型在第一次声明赋值声明的时候, 会在内存中开辟一块空间, 用来存放这个变量被赋的值,  而这个变量实际上存储的, 并不是被赋予的这个值, ...

  10. python学习-27 匿名函数

    匿名函数 1. 语法:   lanbda x:x+1 def a(x): return x+1 res = a(10) print(res) 运行结果: 11 Process finished wit ...