`
diecui1202
  • 浏览: 98453 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java虚拟机学习笔记(四)class文件

阅读更多

一、class文件内容

每个class文件只 能包含一个类或接口;
class文件内容按顺序如下:
  1. magic(魔数)-u4
    • 0xCAFEBABE,其作用在于可以轻松辨别出Java class文件和非Java class文件;
  2. minor_version-u2和major_version-u2(次、主版本号)
    • 对于虚拟机来说,主次版本号确定了特定的class文件格式,通常只有给定主版本号和一系列次版本号后,虚拟机才能读取该class文件;
    • 如下图所示

      第5、6字节表示次版本号=0
      第7、8字节表示主版本号=50(高位在前)
  3. constant_pool_count-u2和constant_pool(常量池)
    • 常量池的数量为constant_pool_count-1,其索引从1开始;
    • 除直接常量外,常量池还包括类和接口的全限定名、字段的名称和描述符以及方法的名称和描述符等符号引用;
    • 每个常量池入口都有一个字节的标志,这个标志指出了列表中该位置的常量类型。虚拟机获取这个标志后,就知道在标志后面的常量类型了;其中每一 个标志都有一个相对应的表结构来描述该常量池;具体类型如下表所示:
  4. access_flags(访问标志)-u2
    • 访问标志展示了文件中类或接口的如下信息: 标志名 值 设置后的含义
      ACC_PUBLIC 0x0001 public类型
      ACC_FINAL 0x0010 类为final类型
      ACC_SUPER 0x0020 使用新型的invokespecial语义
      ACC_INTERFACE 0x0200 接口类型,不是类类型
      ACC_ABSTRACT 0x0400 abstract类型

      附:invokespecial和invokevirtual
      invokespecial指静态绑定后,由JVM产生调用的方法。如super(),以及super.someMethod(),都属于 invokespecial;
      invokevirtual指动态绑定后,由JVM产生调用的方法。如obj.someMethod(),属于invokevirtual;
      正是由于这两种绑定的不同,在子类覆盖超类的方法、并向上转型引用后,才产生了多态以及其他特殊的调用结果。

  5. this_class-u2(当前类)
    • 它是一个对常量池的索引,在this_class位置的常量池入口必须为CONSTANT_Class类型对应的表结构 CONSTANT_Class_info...;
    • 下图显示了常量池的使用方法:

      在CONSTANT_Utf8_info表的bytes里存放的即是当前类的全限定名字符串;
  6. super_class-u2(直接超类)
    • 和this_class表示的内容相同;
    • 除了java.lang.Object类以外,常量池索引super_class对于所有类均有效;
    • 对于java.lang.Object,其super_class为0;
    • 对于接口,其super_class指向的常量池为java.lang.Object;
  7. interfaces_count-u2和interfaces(接口列表)
    • 保存该类直接实现或该接口所扩展的接口数量;
    • 接口按implements子句和extends子句出现的顺序显现;
    • interfaces表中的每一项都是对父接口的常量池的索引,该索引用CONSTANT_Class_info来描述;
    • 如果接口数为0,则没有interfaces表;
  8. fields_count-u2和fields(字段列表)
    • 只有在class文件中由类或接口声明了的字段才在fields列表中列出,不列出从超类或父接口中继承而来的字段;
    • fields列表可能会包含在对应的Java源文件中没有叙述的字段,这是因为Java编译器可能会在编译时向类或者接口添加字段;如对一个内部类的fields列表来说,为了保持对外围类实例的引用,Java编译器会为每个外围类实例添加实例变量
    • 第个field_info表包含以下字段信息:
      • 字段名字
      • 字段描述符和修饰符
      • 如果该字段被声明为final,则还包含其常量值;
  9. methods_count-u2和methods(方法列表)
    • methods_count表示该类或接口中所声明的所有方法的总计数,不包括超类或都父接口中继承来的方法;
    • methods列表中包含以下信息:
      • 方法名和描述符(方法的返回值类型和参数类型)
      • 如果方法即不是抽象的,也不是本地的,则还包含方法局部变量所需的栈空间长度、为方法所捕获的异常表、字节码序列以及可选的行数和局部变量 表
      • 如果方法能够抛出任何已验证异常,则methods列表就会包括一个关于这些已验证异常的列 表
  10. attributes_count-u2和attributes(属性列表)
    • class文件中最后的部分是属性,它给出了该文件中类或接口所定义的属性的基本信息;
    • 每个attribute_info表的第一项是指向常量池中CONSTANT_Utf8_info表的索引,该表给出了属性的名称;
class文件内容举例
  1. 代码
    public interface MyInterface {
        void hello();
    }
  2. 编译后其字节码如下图:
    • 常量池数"0009"表示后面紧接着有8个常量池项
    • 常量池索引1表示一个CONSTANT_Class_info表(07),它引用索引为7的常量池;
    • 常量池索引1表示一个CONSTANT_Class_info表(07),它引用索引为8的常量池;
    • 常量池索引3表示一个CONSTANT_Utf8_info表(01),其内容为hello(方法名);
    • 常量池索引4表示一个CONSTANT_Utf8_info表(01),其内容为()V(方法参数与返回值);
    • 常量池索引5表示一个CONSTANT_Utf8_info表(01),其内容为SourceFile(某属性值);
    • 常量池索引6表示一个CONSTANT_Utf8_info表(01),其内容为MyInterface.java(某属性值);
    • 常量池索引7表示一个CONSTANT_Utf8_info表(01),其内容为MyInterface,被常量池索引1引用到(当前类);
    • 常量池索引8表示一个CONSTANT_Utf8_info表(01),其内容为java/lang/Object,被常量池索引2引用到 (超类);
    • 访问标志"0601"表示是public(0001)、abstract(0400),且是接口(0200);
    • 当前类索引号"0001"表示指向常量池索引1,指明当前类为MyInterface;
    • 超类索引号"0002"表示指向常量池索引2,指明超类为java/lang/Object;
    • 实现的接口数"0000"表示没有实现任何接口;
    • 字段数"0000"表示该接口没有字段;
    • 方法数"0001"表示接口有一个方法;
    • 剩下的字节码为方法列表及属性列表;

二、特殊字符串

全限定名

常量池指向类或者接口时,给出的是全限定名,形如java/util/Hashtable;

简单名称

字段名和方法名以简单名称形式出现在常量池入口中,如上例中的常量池索引3中的"hello";

描述符
  1. 指向字段和方法的符号引用还包含描述符字符串;字段的描述符给出了字段的类型,方法描述符给出了方法的返回值和方法参数的数量、类型以及顺序;
  2. 描述符使用上下文无关语法:斜体表示非终结符,等宽字体表示终结符;
  3. 如下所示:
  4. 基本类型终结符 终结符 类型
    B byte
    C char
    D double
    F float
    I int
    J long
    S short
    Z boolean
  5. 描述符举例 描述符 说明
    I int i;
    [Ljava/lang/Object; java.lang.Object[] obj;
    ([BII)Ljava/lang/String; String method(byte[] b, int i, int j)
    ZILjava/lang/String;II()Z boolean method(boolean b, int i, String s, int j, int k)
分享到:
评论

相关推荐

    学习笔记:深入浅出 Java 虚拟机.docx

    JVM 是一个虚拟计算机,能够执行字节码(.class文件),这些字节码是Java源代码经过编译后的中间表示。JVM 作为抽象层,隔离了底层操作系统和Java程序,使得Java具有高度的跨平台能力。 JVM 和操作系统的关系可以...

    清华大学java学习笔记

    "清华大学java学习笔记" 本资源是一个详细的 Java学习笔记,由清华大学编写,涵盖了 Java 语言的概述、发展史、工作原理、特点等多方面的知识点。 Java 语言概述 Java 语言是一种面向对象的编程语言,具有安全、...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    深入java虚拟机读后笔记

    #### 四、Java虚拟机栈与本地方法栈 Java虚拟机栈和本地方法栈是JVM内存模型的一部分,它们用于支持线程的运行。 1. **Java虚拟机栈**:每一个线程都有自己的虚拟机栈,用于存储方法执行的局部变量表、操作数栈、...

    韩顺平编写的java学习笔记(全)

    3. **运行程序**:通过Java虚拟机(`java.exe`)执行编译后的`.class`文件。 #### 注释 - **单行注释**:使用`//`标记。 - **多行注释**:使用`/* */`包裹注释内容。 #### Java编程方向 - **Java SE (J2SE)**:...

    Java虚拟机JVM类加载学习笔记

    Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理程序运行时的内存。本文主要探讨JVM的类加载机制,包括类加载、连接、初始化等关键过程,以及类的主动使用和被动使用的情况。 首先,我们要理解...

    java class文件格式学习笔记1

    这篇学习笔记主要探讨了Class文件的结构、内容和重要特性。 首先,Class文件是一种语言独立的存储格式,不仅用于Java,也可以支持其他如Scala等JVM为基础的语言。它由字节码构成,这种格式允许JVM执行不同语言编译...

    java基础学习笔记

    - **JVM (Java Virtual Machine)**:Java虚拟机,负责执行由JDK编译生成的字节码文件。 #### 三、编译与解释型程序的区别 - **编译型程序**:先通过编译器将高级语言程序转换成机器语言,运行时直接执行机器语言。 ...

    Java学习笔记及心得

    - **JVM(Java Virtual Machine)**:Java虚拟机,是实现Java跨平台的核心技术,它负责字节码的解释执行,并提供了统一的运行环境。 2. **Java程序执行过程** - Java源代码通过编译器编译成字节码文件(.class)...

    尚硅谷JAVA基础笔记吐血整理

    它的设计目标是实现“一次编写,到处运行”,通过Java虚拟机(JVM)确保代码在不同操作系统上都能运行。Java语言的特点包括简洁性、面向对象、健壮性、安全性、高效性和可移植性。 【基本语法】 Java的基本语法包括...

    java虚拟机学习笔记基础篇

    总结来说,了解Java虚拟机的学习笔记基础篇,可以帮助Java开发者更好地掌握Java程序的执行机制,理解类的加载、链接和初始化过程,以及JVM的内存模型和执行引擎的工作原理,从而编写出更加高效和稳定的Java应用程序...

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...

    java优秀学习笔记

    ### Java优秀学习笔记知识点概述 #### 一、Java语言简介及特性 - **稳健性**:Java通过改进C++中的指针概念引入了引用的概念,从而增强了安全性。Java中的引用不可计算,避免了指针计算可能导致的问题。此外,Java...

    java虚拟机笔记及代码.zip

    Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM之前,我们先要明白什么是字节码:Java源代码经过编译后生成的中间表示,即.class文件,里面包含的就是字节码...

    java学习笔记总结.doc

    这篇文档是个人的Java学习笔记总结,旨在帮助0基础的学习者从零开始掌握Java基础知识,并逐步成为专业的Java开发者。以下是笔记中涉及的一些关键知识点: 1. **Java开发环境的设置**: 要开始Java编程,首先需要...

    理解虚拟机--有笔记版

    Java虚拟机规范定义了JVM在执行Java程序时必须遵守的行为准则,它包括类文件格式、字节码指令集、执行引擎的行为等。 除了上述提到的基础知识点外,《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》这本...

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...

    Java 学习笔记.pdf

    - **java**: 启动Java虚拟机(JVM)执行class文件。 - **javac**: Java源代码编译器,将.java文件编译成.class文件。 - **jar**: Java打包工具,用于创建.jar文件。 - **javadoc**: Java文档生成工具,根据源代码中的...

Global site tag (gtag.js) - Google Analytics