• 【Java】「深入理解Java虚拟机」学习笔记(4)- 类文件结构


      我为什么喜欢Java,另一个重要原因就是跨平台,WORA。

      程序员是爽了,但肯定有人要为你遮风挡雨,解决WORA的基石就是字节码+虚拟机。   

    ♣Tip

      其实这里存在两种无关性,一是平台无关性、另一个是语言无关性。通过向不同的硬件平台和操作系统提供

    不同的JVM实现上层应用和底层平台之间的解耦;另一个,JVM生态系统中有多种语言如Scala、Groovy和Jruby,

    它们通过编译生成统一的字节码来实现互操作,达到了语言无关性的目的,这样各个语言可以在各自擅长的领域发挥作用。

      概括了一下字节码文件的特点:

        (1)以字节(8bit)为最小单位进行存储。意思就是,任意取<8bit的内容,没有意义。

        (2)排列紧凑。中间没有一个空格或分隔符。

        (3)一个类对应一个.class文件。注意,不是一个.java文件对应一个.class,内部类的.class前会有个主类名+$符。

      那么字节码的构成是什么样的呢?

      看起来很像通讯协议的报文,毕竟它们都是一种字节流。实际上其本质可以理解为编译器和JVM之间的一种通讯协议。

    一、字节码文件的构成

    1、魔数与版本

      每个.class文件都是以CAFEBABE四个字节开始,它的作用就是标识这个文件是.class文件。

      第5到第8这四个字节是.class文件的版本号。Java的策略是向下兼容,就是高版本的虚拟机可以跑低版本的字节码。反过来的话,加载验证的时候就会出错。

    2、常量池(Constant Pool)

      池是个形象的说法。包含字面量(literal)和符号引用(Symbolic References)。常量数目是不固定的,所以常量池区域在字节码文件中以常量计数器开始。

        ①字面量可以认为是Java中的常量,包括字符串、final常量。

        ②符号引用包括,类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

      需要指出的是,常量的表示很复杂,每种常量都用自己独特的数据结构来表达。  

    ♣字节码分析工具javap

      查看x.class文件中的常量池可以用命令:

        javap -verbose x。 

    3、访问标识(access_flag)

      访问标识长度为两个字节(16位),其中8位已被定义。它主要用来表示类或接口的属性等信息(如public、abstract、final等)。

    4、类索引(this_class)、父类索引(super_class)及接口索引(interfaces)集合

      用来确定类的继承和实现关系。

    5、字段表集合(field_info)

      描述类或接口中定义的字段。

    6、方法表集合

    7、属性表集合(attribute_info)

      每个类、字段、方法需要用自己特有的数据结构来表示,这种数据结构就是属性表。

      另外,字节码指令跟汇编指令一样,也由操作码(opcode)和操作数(operands)构成。

      ①数据类型

        有意思的是操作码助记符包含了其操作数的数据类型,如iload表示加载int型数据到操作数栈,fload则表示加载float型数据。

      ②指令类型

        Ⅰ.包括加载*load、存储*store、运算*add。

        Ⅱ.类型转换指令。Java默认支持小->大的转换,如int->long,这个无需指令。但是大到小则需要转换指令如,i2b表示int转byte,并且会丢失精度。

        Ⅲ.对象创建与访问。new创建对象,newarray创建数组。

         Ⅳ.操作数栈管理。如pop将操作数顶出栈,。

         Ⅴ.控制转移指令。ifeq如果等于、iflt如果大于、tableswitch复合条件分支、goto跳转。

         Ⅵ.方法访问和返回。invokevirtual调用对象的实例方法、invokestatic调用对象的静态方法

         Ⅶ.异常处理指令。athrow。

              Ⅷ.同步指令。monitorenter和monitorexit两条指令用来支持synchronized关键字。

  • 相关阅读:
    Linux使用Public Key方式远程登录
    Linux编译安装Mariadb数据库
    Centos7环境搭建lnmp环境
    浅谈Java中的System.gc()的工作原理
    Eclipse快捷键大全(转载)
    java中的参数传递——值传递、引用传递
    Visual Studio 2017 安装后无法创建c++或MFC项目
    ubuntu sendmail配置发送邮件
    ubuntu11.0静态IP地址配置
    cin与cout详解
  • 原文地址:https://www.cnblogs.com/tigerhsu/p/9930461.html
Copyright © 2020-2023  润新知