JVM类加载==>类结构与.class文件字节码指令

一,类结构

himagic:魔数

minor_version  小版本号

major_version 主版本号

constant_pool_count 常量池

access_flags 访问修饰符(public)

this_class 类的包名,类名

super_class 父类

interfaces_count 接口信息

fields 成员变量,静态变量等变量信息

method 方法信息

attributes_count 附加属性

用一段代码:

 

编译成.class字节码文件就是这样(16进制) 

  

一)魔数

二)版本信息

类中没有小版本号

00 34 是十六进制, 对应的十进制是52,52版本号对应Java8

 

三)常量池

下图简称图1

 

注意: 以下为16进制表示,每位代表一个二进制的4位(1111 = 16),所以两位就代表一个字节

常量池中存储34项内容

 

常量池的第一项0a的十进制是10,我们去图1中可以看到这是Methodref, 各用两个字节存储常量池的方法所属类,和方法名

 

 

 

 

构造方法

 

局部变量表

代表字符串

这三个代表方法的方法名,参数,返回值等信息

 

args参数的类型

 

方法参数

下面两个合在一起表示类的源文件是HelloWorld.Java 

 

本类全限定名

父类全限定名

 

四)访问标识与继承信息

五)Field信息

 

六)附加属性

 

二,字节码指令

.java源代码被编译成二进制.class字节码文件, 那么源代码中的方法在.class文件中是怎么执行的呢?

下面有两个方法的二进制执行流程

init()方法

下图是一个Hello World类的构造方法,位于0000720行

jvm首先会在局部变量表中找到this, 放入操作数栈中

b7. 相当于 .    调用方法

00 01 调用父类的构造方法

 

官方文档里2a对应aload_0, b1对应return

 

main()方法

00 02 代表System类中的静态变量out, out的类型为PrintStream

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 17:26:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 17:26:04       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 17:26:04       82 阅读
  4. Python语言-面向对象

    2023-12-08 17:26:04       91 阅读

热门阅读

  1. JDK、JRE、JVM、SE、EE、ME的区别

    2023-12-08 17:26:04       46 阅读
  2. Requests库详解、详细使用、高级用法

    2023-12-08 17:26:04       51 阅读
  3. 折半查找(数据结构实训)

    2023-12-08 17:26:04       65 阅读
  4. 博客摘录「 C语言之二维数组赋值」

    2023-12-08 17:26:04       45 阅读
  5. kali常用命令

    2023-12-08 17:26:04       54 阅读
  6. springboot快速入门

    2023-12-08 17:26:04       60 阅读
  7. 虚拟化之Stage2地址翻译

    2023-12-08 17:26:04       53 阅读
  8. 对音频打上标签,从标签开始播放

    2023-12-08 17:26:04       63 阅读
  9. oceanBase存储返回多个值

    2023-12-08 17:26:04       60 阅读
  10. 【android开发-20】android中notification的用法讲解

    2023-12-08 17:26:04       48 阅读