クラスコレクションのJVM仮想マシン---(11)メソッドテーブルのファイル構造

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/qq1021979964/article/details/97129710

表の収集方法

ほぼ同一のフィールドのための方法の記述クラスファイルの記述は、同一の構成及び方法のテーブルのテーブルのフィールド順次アクセスフラグを含む(access_flags)を有し、名前インデックス(name_index)、記述子インデックス(description_index)、テーブルセット属性(属性)の数。

 

1.テーブル構造の方法を(method_info)組成

アクセスフラグ(access_flags)、名前指数(name_index)、説明指数(descriptor_index)、属性テーブルのコレクション

2.ケース

public class TestMethod {

    public int add(int a,int b) {
        return a+b;
    }

}

テーブルのフィールドの後カウンタ方式のセットは、次にゾーン法の上にあります。私達はちょうど上記の方法が追加定義し、それは引数なしのコンストラクタであるため、2つの表示方法は、あなたは、コンストラクタについての最初の話は、あります

方法カウンタ:0×0002(2進数に対応する)、2つの方法があります。

3.コンストラクタメソッドケース

  1. メソッドのアクセスフラグ:0x0001に、公衆に対応します。
  2. メソッド名:0x0004は(4 10進数に対応する)、初期化のための定数プール第4ポイント。
  3. 記述子インデックス:0x0005は、定数プールの点5(5小数に相当)であり、()Vは、パラメータなしの方法、ノーリターン値を表します。
  4. カウンタ属性:0x0001の(1 10進数に対応する)は、メソッドテーブルは、プロパティ・シートを有することを示します。密接背後に続きます。
  5. テーブル名インデックス属性:0x0006(6進数に対応する)、コード用の第六の定数プールを指し、コードは、属性テーブルの種類を示します。
  6. 長さ属性:0000 001D(29 10進数に相当)、29は、後続のバイトコードがテーブル属性を示す情報であることを示します。
  7. オペランドスタックの最大深さは0x0001(10進数1に対応)は、スタックフレームの最大深度はオペランドスタックで表しています。
  8. 局部变量表的最大容量:0x0001(对应十进制的1),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  9. 机器指令数目:0x0000 0005,表示后续的5个字节是机器指令集。
  10. 机器指令集:0x002A、0x00B7、0x0000、0x0001、0x00B1。
  11. 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
  12. Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
  13. Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。

LineNumberTable属性表的就不说了,直接过掉了。

4.自定义方法案例

  1. 方法访问标志:0x0001,对应public。
  2. 方法名称:0x0008(对应十进制为8),指向常量池的第8,为add。
  3. 描述符索引:0x0009(对应十进制为9),指向常量池的第9,为(II)I,表示方法参数有2个都是Int类型,返回值类型是Int。
  4. 属性计数器:0x0001(对应十进制为1),表示该方法表中有1个属性表。紧跟在后。
  5. 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
  6. 属性长度:0x0000 001C(对应十进制的28),表示后续28个字节是表示这个Code属性表的信息。
  7. 操作数栈的最大深度:0x0002(对应十进制的2),表示栈帧中操作数栈的最大深度是2。
  8. 局部变量表的最大容量:0x0003(对应十进制的3),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  9. 机器指令数目:0x0000 0004,表示后续的4个字节是机器指令集。
  10. 机器指令集:0x001B、0x001C、0x0060、0x00AC。
  11. 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
  12. Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
  13. Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。

LineNumberTable属性表的就不说了,直接过掉了。

おすすめ

転載: blog.csdn.net/qq1021979964/article/details/97129710