JVM虚拟机-Class文件之方法表集合

简介: JVM虚拟机-Class文件之方法表集合

 

一、概述

方法表集合与属性表集合的结构类似,是对方法的修饰符、返回类型、方法名、参数个数、参数类型、方法体的描述集合。

image.gif编辑

方法表集合的结构是一个类似于数组的结构,JVM在对java文件进行编译时,会将类中的方法个数放到方法计数器中,然后将每个方法组成method_info结构,依次存在在方法计数器之后。

二、方法表集合的构成

方法表集合的结构与字段表结构非常的类似,开头也是用了两个字节表示方法的个数,然后接着是每个方法的描述。

1.方法计数器

方法表集合是由很多method_info组成的,所以方法表集合的前两个字节表示有多少个方法,占两个字节,16位。

2.method_info

method_info{
    access_flag;//访问修饰符
    name_index;//方法名称(这里是常量池中的index)
    descriptor_index;//参数的类型以及返回值得类型(同样指向常量池得编号)
    attributes_count;//属性个数
    attibutes;//属性表(这里得属性个数及属性表都放在属性表中得‘Code’属性里面)
}

image.gif

image.gif编辑

3.access_flags

与属性表集合的相同,这里不再重复,请参考《JVM虚拟机-Class文件之字段表集合》相关部分内容。

4.name_index和descriptor_index

name_index和descriptor_index,是对常量池的引用,name_index指字段的简单名称,descriptor_index指字段描述符。

descriptor_index描述符用来描述方法的参数列表(包括数量,类型以及顺序)和返回值.根据描述符规则,无返回值的void类型都用一个大写字符来表示。

三、实例拆解

定义一个类:

public class HelloWord{
    public Object test(){return null;}
}

image.gif

字节码文件:

image.gif编辑

public class com.csdn.reader.HelloWord
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#15         // java/lang/Object."<init>":()V
   #2 = Class              #16            // com/csdn/reader/HelloWord
   #3 = Class              #17            // java/lang/Object
   #4 = Utf8               <init>
   #5 = Utf8               ()V
   #6 = Utf8               Code
   #7 = Utf8               LineNumberTable
   #8 = Utf8               LocalVariableTable
   #9 = Utf8               this
  #10 = Utf8               Lcom/csdn/reader/HelloWord;
  #11 = Utf8               test
  #12 = Utf8               ()Ljava/lang/Object;
  #13 = Utf8               SourceFile
  #14 = Utf8               HelloWord.java
  #15 = NameAndType        #4:#5          // "<init>":()V
  #16 = Utf8               com/csdn/reader/HelloWord
  #17 = Utf8               java/lang/Object
{
  public com.csdn.reader.HelloWord();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       5     0  this   Lcom/csdn/reader/HelloWord;
  public java.lang.Object test();
    descriptor: ()Ljava/lang/Object;
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aconst_null
         1: areturn
      LineNumberTable:
        line 4: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       2     0  this   Lcom/csdn/reader/HelloWord;
}
SourceFile: "HelloWord.java"

image.gif

方法解析:

image.gif编辑

image.gif编辑

四、总结

方法表集合中不会列出从父类或者父接口中继承而来的方法,但有可能列出原来Java代码中不存在的方法,比如无参构造方法。

参考资料:

    1. class类文件结构——方法表集合_Joy CR的博客-CSDN博客
    相关文章
    |
    6月前
    |
    Arthas 存储 算法
    深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
    JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
    659 55
    |
    4月前
    |
    存储 Java 编译器
    深入理解Java虚拟机--类文件结构
    本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
    137 0
    |
    7月前
    |
    Arthas 监控 Java
    Arthas redefine(加载外部的.class文件,redefine到JVM里 )
    Arthas redefine(加载外部的.class文件,redefine到JVM里 )
    316 15
    |
    11月前
    |
    存储 Java 开发者
    浅析JVM方法解析、创建和链接
    上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
    521 132
    |
    6月前
    |
    Arthas 存储 Java
    JVM深入原理(三+四):JVM组成和JVM字节码文件
    目录3. JVM组成3.1. 组成-运行时数据区3.2. 组成-类加载器3.3. 组成-执行引擎3.4. 组成-本地接口4. JVM字节码文件4.1. 字节码文件-组成4.1.1. 组成-基础信息4.1.1.1. 基础信息-魔数4.1.1.2. 基础信息-主副版本号4.1.2. 组成-常量池4.1.3. 组成-方法4.1.3.1. 方法-工作流程4.1.4. 组成-字段4.1.5. 组成-属性4.2. 字节码文件-查看工具4.2.1. javap4.2.2. jclasslib4.2.3. 阿里Arthas
    125 0
    |
    6月前
    |
    存储 安全 Java
    JVM深入原理(五):JVM组成和JVM字节码文件
    类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析。
    104 0
    |
    8月前
    |
    监控 测试技术 数据库
    详解Hyper-V虚拟机CPU分配方法
    在Hyper-V环境中,合理分配虚拟机的CPU资源至关重要。vCPU是物理CPU的虚拟化表示,管理员可通过指定处理器数量、核心数、设置兼容性和亲和性、启用动态分配等方法优化性能。使用性能监视工具监控并调整CPU资源,避免过度分配,确保虚拟机稳定运行。定期评估和优化资源分配策略,以适应业务变化,保持最佳性能。
    |
    Arthas 监控 数据可视化
    JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
    本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
    |
    SQL 缓存 Java
    JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
    这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
    180 3
    |
    小程序 Oracle Java
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
    这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
    264 0
    JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用