方法在程序的重要性不言而喻,了解方法在字节码中的表达能够使我们开发做到更加心中有数。

再看class文件结构

上一步已经分析完了class文件中的字段(field_info)的表达,接下来就是方法数(methods_count)与方法(method_info)结构;

方法开始位置

上一次分析完字段的位置在“00 01 00 02 00 05 00 06 00 00”,没有最后的4个零表示字段的字段的attributes_count为0个,上次没有注意,这里更正下。接下来分析开始位置如下图:

方法结构

首先看最开始两个字节“00 03”表示methods_count表示有3个方法。说明接下来将有3个方法,方法也是拥有他独立的结构的,结构详解如下图:

方法结构中最开始两个字节表示访问标识,与字段和类的方法标识差不多,不过他们在二进制中表示更加有规则,如下图:

可以看到每个标识占用16位的二进制一个位置,也就是说方法的访问标识理论上是可以自由组合的。

字节码讲解

先看接下来的8个字节“00 01 00 07 00 08 00 01”分别表示访问标识、名称索引、描述符索引、属性数量,结合常量池(索引都是指向常量池)与标识表得出结果分别为:public、、()V、1。其中在字节码中表示构造方法,()V由两部分组成,()包含的参数,这里表示没有参数,括号后面会跟一个字符表示返回类型,这里V表示void,所以这里第一个方法是由于我们没有创建构造方法由系统自带创建的一个无参构造方法。

属性结构

最后一个1表示有一个属性结构(attribute_info),属性结构是一个特殊的结构,它可以存在类、字段结构、方法结构中,并且属性结构种类很多,每种包含的内容完全不同,不过他的基本结构如下图:

attribute_info结构包含2个基础结构,2个字节的属性名称索引和4个字节的子属性结构长度,所有不同的属性结构前面两个结构都是一样的,根据属性名称索引不同有不同的结构。如上图的Code是其中一个attribute_info结构,它存在方法结构中,用来表示方法的代码执行相关信息的。

code结构分析

继续字节码文件分析”00 09 00 00 00 38“表示构造方法的attribute_info结构,”00 09“指向常量池第9项表示Code,说明这个attribute_info是Code结构,”00 00 00 38“表示接下来有56项Code结构的子结构。

接着8个字节”00 02 00 01 00 00 00 0A“分表表示Code结构操作数栈最大值、局部变量所需存储空间、代码长度,结果分别输2、1、10;10表示接下来有10个字节码指令。

字节码指令由一个字节组成,所以最多只能有256条指令,具体每个值对应操作指令在Java虚拟机规范可以查到。

接着在看接下来10个字节”2A B7 00 01 2A 03 B5 00 02 B1“分别对应字节码指令与解释如下:

1、2A对应指令aload_0,表示将第0个变量槽中为reference类型的本地变量推送到操作数栈顶;

2、B7对应指令invokespecial,表示以栈顶的reference类型的数据所指向的对象最为方法接收者。后面会跟2个字节的参数,表示指向常量池项,参数”00 01“表示指向常量池第一项值”java/lang/Object."":()V“,可以看出这里执行了object的初始化方法,也就是执行初始化方法先执行父类初始化方法;

3、2A对应指令aload_0,表示将第0个变量槽中为reference类型的本地变量推送到操作数栈顶;

4、03对应指令iconst_0,表示将int型0推送至栈顶;

5、B5对应指令putfield,为指定类的实例域赋值,后面紧跟2个字节指向常量池中”00 02“,值为”com/dggcc/test/lei/ClassTest.var1:I“,表示给var1赋值;

6、B1对应指令return,表示从方法返回,返回值为void,方法正常结束;

code结构就分析完成了,接下来两个字节表示code的attribute_info数量,这里是”00 00“,表示code结构没有属性结构。

LineNumberTable

再接着两个字节”00 02“表示方法的attribute_info数量,”00 0A“对应的属性结构是名称索引在常量池的值为”LineNumberTable“,这个结构表示的是字节码行号与字节码行号对应关系;LineNumberTable结构如下图:

分析接下来6个字节"00 00 00 0A 00 02"表示LineNumberTable长度为10,有2个line_number_info结构,直接读后面8个字节,把2个line_number_info读完”00 00 00 08 00 04 00 09“,字节码第0行对应源码第8行,第4行对应第9行,8、9行分别是类和变量定义那一行。由于初始化方法是系统定义,所以在源代码中没有体现,所以指向第8行。

LocalVariableTable

接下来2个字节”00 0B“指向常量池第11项结果为”LocalVariableTable“表示方法本地变量表,结果如下图:

直接看接下来6个字节”00 00 00 0C 00 01“表示长度12,有一个line_number_info,读取这一个info的10个字节”00 00 00 0A 00 0C 00 0D 00 00“,表示这个变量从0开始到10结束(刚刚分析code一个10行),名称索引对应常量池第12项”this“,描述对应13项”Lcom/dggcc/test/lei/ClassTest;“,在局部变量槽第0位;

这里说明构造方法了参数this;

总结

通过对构造方法字节码分析我们可以学习到几点,首先是没有手动写构造方法字节码中会自动创建一个无参的构造函数,并且构造函数首先就去执行了父类的构造函数。接下来才是对对象字段的赋值。同时通过构造函数的参数可以得出即使是一个无参函数实际上还是传了一个this参数。

构造函数比较特殊,后面再看看两个简单的函数!

Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!

java 必须存在默认构造器_Java默认构造方法在字节码的实现相关推荐

  1. Java反射机制01_反射的概念以及获取字节码信息 的四种方式

    Java反射机制01-反射的概念以及获取字节码信息 的四种方式 一.反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象, 都能够调用它的任意 ...

  2. java 字节码加载_java面试题jvm字节码的加载与卸载

    虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换分析和初始化,最终形成可以被虚拟节直接使用的JAVA类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存到卸载出内存的生命周期 ...

  3. java 字节码详解_Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  4. java中j 和 j啥区别_从字节码层次分析++j和j++的区别

    一.缘起 最近看到个面试题: int j = 0; for(int i = 0; i <100; i++) j = j++; System.out.println(j); 输出结果是0,如果换成 ...

  5. 【Java基础】HashMap扩容 | CopyOnWriteArrayList 的底层原理 | 字节码 | Java 异常体系

    1. HashMap的扩容机制 JDK 1.7 扩容是针对数组进行扩容,链表是不需要进行扩容的.扩容时先生成原来数组两倍大小的新数组,在把原来老数组上的链表上的元素转移过去.具体在转移链表中元素的步骤 ...

  6. java xmx 默认值_java默认的Xmx大小

    记录这个问题是因为看到CSDN上一个人问的一个问题: 为什么-Xmx的设置不管用,问题的内容大概是用top看进程资源的时候,VIRT列的内容为什么不符合自己设的值的预期(跟Xmx的值的关系). 1. ...

  7. java关于包的叙述_Java中构造方法,包的引用,final,super等词的概括

    final修饰的类不允许被继承. 一个类不能既是final的,又是abstract的.因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,两者矛盾. f ...

  8. java 静态传值到构造器_java 静态初始化块,初始化块,构造器执行顺序

    public class Test1 { static{ System.out.println("执行静态初始化块test1..."); } { System.out.printl ...

  9. java你画我猜源代码_java 你画我猜源码

    [实例简介] java项目你画我猜,主界面是NHWC.java,服务器类是NHWCserver.java,写的比较烂,仅供参考! [实例截图] [核心代码] 0cae4560-0eff-4c8c-a8 ...

最新文章

  1. NB-IOT来了,物联网时代才真正来临
  2. 【统计学习方法】决策树
  3. 初次运行git前的配置
  4. javascript计时原理
  5. 如何配置一套优雅的Lua开发环境
  6. nrf52832芯片手册_nRF52832低功耗问题不完全总结
  7. python脚本 游戏赚金币_python捡金币游戏(上)
  8. Socket通信学习(一):Socket通信原理
  9. 九度OJ 1175:打牌 (模式匹配)
  10. MySQL灾备恢复在线主从复制变成主主复制及多源复制【转】
  11. Java ThreadLocal study 2
  12. cad插件_CAD插件自动编号安装教程
  13. [转]24个英文电子书免费下载网站
  14. Java课程学习四:编程题
  15. php unlink没有权限,php中删除文件用unlink函数权限判断_PHP教程
  16. EayRadius 于 2013-7-19 进行体验度更新,增加用户体验度
  17. 代码审计| HDWiki 漏洞(一)
  18. @CacheEvict-缓存
  19. 手机输入法emoji、颜文字存储
  20. 32位系统和64的区别c语言,32位 与 64 位 区别 : CPU 操作系统 应用程序...

热门文章

  1. 24 location对象
  2. 12Singleton(单例)模式
  3. 计算机书籍-医学图像数据可视化分析与处理
  4. 重磅!这所985高校迎来新任院士校长!他能否带领学校走出“低谷”?
  5. 用于类别级物体6D姿态和尺寸估计的标准化物体坐标空间
  6. 基于深度学习的点云配准Benchmark
  7. 有哪些好的科研和学习习惯?
  8. Spring rabbitmq消息机制--手动确认
  9. Nature子刊:三代Nonopore测序数据耐药性分析软件NanoOK RT
  10. PCE:南农沈其荣团队根系分泌物驱动土壤-微生物-养分之间的反馈作用以响应植物的生长...