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博客
    相关文章
    |
    3月前
    |
    SQL 存储 数据挖掘
    【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
    虚拟机数据恢复环境: 某品牌R710服务器+MD3200存储,上层是ESXI虚拟机和虚拟机文件,虚拟机中存放有SQL Server数据库。 虚拟机故障: 机房非正常断电导致虚拟机无法启动。服务器管理员检查后发现虚拟机配置文件丢失,所幸xxx-flat.vmdk磁盘文件和xxx-000001-delta.vmdk快照文件还在。服务器管理员在尝试恢复虚拟机的过程中,将原虚拟机内的xxx-flat.vmdk删除后新建了一个虚拟机,并分配了精简模式的虚拟机磁盘和快照数据盘,但原虚拟机内的数据并没有恢复。
    【虚拟机数据恢复】VMware虚拟机文件被误删除的数据恢复案例
    |
    1月前
    |
    存储 Java 数据安全/隐私保护
    【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
    【JVM】Java虚拟机栈(Java Virtual Machine Stacks)
    35 0
    |
    20天前
    |
    缓存 Java C#
    【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
    【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
    57 0
    |
    2天前
    |
    存储 XML 监控
    JVM工作原理与实战(三):字节码文件的组成
    JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了字节码文件的基础信息、常量池、方法、字段、属性等内容。
    |
    1月前
    |
    存储 Java 编译器
    JVM虚拟机内存区域详情
    JVM虚拟机内存区域详情
    15 0
    |
    1月前
    |
    存储 安全 前端开发
    什么是Java虚拟机(JVM),它的作用是什么?
    什么是Java虚拟机(JVM),它的作用是什么?
    |
    1月前
    |
    存储 Java 开发者
    深入理解Java虚拟机(JVM)内存管理
    【2月更文挑战第11天】 在本篇文章中,我们将深入探讨Java虚拟机(JVM)的内存管理机制,一项对于优化Java应用性能至关重要的技术领域。不同于常规的技术文章摘要,我们不仅概述了JVM内存管理的基本概念,还将引导读者通过实际案例理解其在现实世界应用中的重要性。从堆(Heap)和栈(Stack)的区别开始,到垃圾收集(Garbage Collection)机制的工作原理,本文旨在为Java开发者提供一个清晰、系统的JVM内存管理知识框架,帮助他们在开发过程中做出更加明智的决策。
    |
    2月前
    |
    存储 Linux KVM
    |
    2月前
    |
    存储 Java 编译器
    深入理解JVM - 类文件结构
    深入理解JVM - 类文件结构
    57 1
    |
    3月前
    |
    安全 前端开发 Java
    【JVM】<Java虚拟机>JVM架构&各种**虚拟机
    【1月更文挑战第26天】【JVM】<Java虚拟机>JVM架构&各种**虚拟机

    热门文章

    最新文章