JVM虛擬機-Class文件之方法表集合

一、概述

方法表集合與屬性表集合的結構類似,是對方法的修飾符、返回類型、方法名、參數個數、參數類型、方法體的描述集合。

方法表集合的結構是一個類似於數組的結構,JVM在對java文件進行編譯時,會將類中的方法個數放到方法計數器中,然後將每個方法組成method_info結構,依次存在在方法計數器之後。

二、方法表集合的構成

方法表集合的結構與字段表結構非常的類似,開頭也是用了兩個字節表示方法的個數,然後接着是每個方法的描述。

1.方法計數器

方法表集合是由很多method_info組成的,所以方法表集合的前兩個字節表示有多少個方法,佔兩個字節,16位。

2.method_info

method_info{
    access_flag;//訪問修飾符
    name_index;//方法名稱(這裏是常量池中的index)
    descriptor_index;//參數的類型以及返回值得類型(同樣指向常量池得編號)
    attributes_count;//屬性個數
    attibutes;//屬性表(這裏得屬性個數及屬性表都放在屬性表中得‘Code’屬性裏面)
}

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;}
}

字節碼文件:

 

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"

 方法解析:

四、總結

方法表集合中不會列出從父類或者父接口中繼承而來的方法,但有可能列出原來Java代碼中不存在的方法,比如無參構造方法。

參考資料:

  1. https://blog.csdn.net/xiaoqiu_cr/article/details/86742206
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章