Javaクラスファイルの概要

クラスファイルは、唯一のクラスまたはインタフェースを含めることができます。

Javaクラスファイルは8バイトのバイナリストリームです。

実際のデータのエントリの前に位置する可変長のJavaクラスファイルのサイズと長さで。

クラスファイルの基本的なタイプ

  U1の1バイト符号なしタイプ

  U2の2バイト符号なしタイプ

  U4の4バイト符号なしタイプ

  U8の8バイト符号なしタイプ

==========================================

以下は、Javaソースコードファイルであります

パブリッククラスClassTestは{
    最終的な静的int型constantInt = 12。
    最終的な静的文字列constantString =「我很好」。
    静的int型variableInt = 12;
    静的な文字列variableString = "我很好"。
    プライベートint型の変数。
    プライベート文字列変数2;

    静的な無効メインパブリック(文字列[]引数){
        System.out.printlnは( " -これはmain()メソッドであります---")。

    }
    公共ボイドは(){言う
        のSystem.out.println( "这是普通方法")。
    }
    公共ClassTestは(int型変数、文字列変数2){
        スーパー()。
        変数= this.variable。
        this.variable2 =変数2;
    }
    パブリックClassTestは(){
       
    }

次のバイトコードファイルを表示するにはueditエディタです

バイトコードファイルてjavap -v ClssTest.classビューの内容は次のとおり 

最後に2019年7月24日に変更。サイズ924バイトの
  MD5チェックサムbe5b20653620d7d2b495a3f99e3fb417
  "ClassTest.java"より作成
パブリッククラスClassTestは
  0:マイナーバージョン
  メジャーバージョン:52の
  旗:ACC_PUBLIC、ACC_SUPER
定数プール:
  #1 =するFieldRef#34#35 // Javaの/ LANG /のSystem.out :Ljava / IO /のPrintStream。
  #2 =文字列#36 // - main()の方法---是这
  #3 = Methodref#37#38 //のJava / IO / PrintStream.println:(Ljava /ラング/文字列;)Vの
  #4 =列#39 //这是普通方法
  #5 = Methodref#12#40 //のJava /ラング/オブジェクト"<初期化>" :()V。
  #6 =するFieldRef#11#41 // ClassTest.variable。私
  #7 =するFieldRef#11#42 // ClassTest.variable2:Ljava /ラング/文字列;
  #8 =するFieldRef#11#43 // ClassTest.variableInt:私は
  #9 =文字列#44 //我很好
  #10 =するFieldRef#11#45 // ClassTest.variableString:Ljava /ラング/文字列;
  #11 =クラス#46 // ClassTestは
  #12 =クラス#47 //のJava / langは/ OBJECT
  #13 = UTF8 constantInt
  #14 = UTF8 I
  #15 = UTF8一定値
  #16 =整数12
  #17 = UTF8 constantString
  #18 =をUTF8 Ljava /ラング/文字列。
  #19 = UTF8 variableInt
  #20 = UTF8 variableString
  #21 = UTF8変数
  #22 = UTF8変数2
  #23 = UTF8主
  #24 = UTF8([Ljava /ラング/文字列;)Vの
  #25 = UTF8コード
  #26 = UTF8 LineNumberTable
  #27 = UTF8言う
  位28 = UTF8()V
  #29 = UTF8 <初期化>
  #30 = UTF8(ILjava / LANG /文字列;)Vの
  #31 = UTF8 <clinit>
  #32 = UTF8 SOURCEFILE
  #33 = UTF8 ClassTest.java
  #34 =クラス# 48 // Javaの/ LANG /システム
  #35 = NameAndType第49位:#50 //アウト:Ljava / IO /のPrintStream。
  #36 = UTF8 -このmain()メソッド---される
  ## 51 37であるのPrintStream [= // Javaクラス/ IO /
  #38がNameAndType#= 52である://#53のprintlnは、(Ljava /ラング/文字列;)V
  #39 = UTF8は、これが一般的な方法である
  。#40 = NameAndType#29:#28 // "<初期化>" :()は、V
  #41は#21 NameAndType =である:#14 //変数:I
  #42 NameAndType =#22である。# //変数2 18:Ljava /ラング/文字列;
  #43 = NameAndType#19:#14 // variableInt:I
  #44 = UTF8元気です
  #45 = NameAndTypeの#20:# 18 // variableString:Ljava /ラング/文字列;
  #= 46 UTF8 ClassTestはのある
  #47 = UTF8のJava / LANG /オブジェクト
  #48 = UTF8のJava / LANG /システム
  #49 = UTF8アウト
  #50 = UTF8 Ljava / IO /のPrintStream。
  #51 = UTF8のJava / IO /のPrintStream
  #52 = UTF8のprintln
  #53 = UTF8(Ljava /ラング/文字列;)V
{
  静的最終int型constantInt。
    記述:I
    フラグ:ACC_STATIC、ACC_FINAL
    一定値:int型12

  static final java.lang.StringでconstantString。
    記述:Ljava / LANG /文字列。
    フラグ:ACC_STATIC、ACC_FINAL
    一定値:文字列我很好

  静的int型variableInt。
    記述:I
    フラグ:ACC_STATIC

  静的なjava.lang.StringでvariableString。
    記述:Ljava / LANG /文字列。
    フラグ:ACC_STATIC

  公共の静的な無効メイン(java.lang.Stringで[])。
    記述子:([Ljava /ラング/文字列;)Vの
    フラグ:ACC_PUBLIC、ACC_STATIC
    コード:
      スタック= 2、地元= 1、args_size = 1
        0:getstatic#1 //フィールドのJava / LANG /のSystem.out:Ljava / IO / PrintStream。
        3:LDC#2 //文字列-这方法---)(主是
        5:INVOKEVIRTUAL#3 //メソッドのJava / IO / PrintStream.println:(Ljava /ラング/文字列;)V
        8:戻り
      LineNumberTable:
        ライン11:0
        行13:8

  公共ボイド)(言います。
    記述子:()は、V
    フラグ:ACC_PUBLIC
    コード:
      スタック= 2、地元の人々が= 1、args_size = 1
        0:getstatic#1 //フィールドのJava /ラング/のSystem.out:Ljava / IO /のPrintStream。
        3:LDC#4 //文字列这是普通方法
        5:INVOKEVIRTUAL#3 //メソッドのJava / IO / PrintStream.println:(Ljava /ラング/文字列;)V
        8:戻り
      LineNumberTableを:
        行15:0
        行16:8

  公共ClassTestは(int型、java.lang.Stringで);
    記述子:(ILjava / LANG /文字列;)Vの
    フラグ:ACC_PUBLIC
    コード:
      スタック= 2、地元の人々は= 3、args_size = 3
        0:aload_0
        1:invokespecial#5 //メソッドのJava / langは/オブジェクト"<初期化>"。 ()V
        4:aload_0
        5:iload_1
        6:putfield#6 //フィールド変数:I
        9:aload_0
        10:aload_2
        11:putfield#7 //フィールド変数2:Ljava /ラング/文字列;
        14:戻り
      :LineNumberTable
        行18:0
        行19:4
        行20:9
        行21:14

  公共ClassTestは();
    記述子:()Vの
    フラグ:ACC_PUBLIC
    コード:
      スタック= 1、地元の人々は= 1、args_size = 1
        0:aload_0
        1:invokespecial#5 //メソッドのjava / langは/オブジェクト"の<init>" :()V。
        4:リターン
      LineNumberTable:
        行22:0
        行24:4

  } {静的。
    記述子:()は、V
    フラグ:ACC_STATIC
    コード:
      スタック= 1、地元= 0、args_size = 0
        0:bipush 12
        2:putstatic#8 //フィールドvariableInt:I
        5:LDC#9 //文字列我很好
        7:putstatic #10 //フィールドvariableString:Ljava / LANG /文字列。
        10:戻り
      :LineNumberTable
        行5:0
        行6:5
}
SOURCEFILE: "ClassTest.java"を

シンプルバージョン:

マイナーバージョン:0 // ---メジャーバージョン番号
  メジャーバージョン:52 // ---のマイナーバージョン番号     
  のフラグ:ACC_PUBLIC、ACC_SUPER // ---クラスのアクセスアイデンティティ
 // ---定数プール
コンスタントプール:
  第1位= 34 //#35#するFieldRefのJava /ラング/のSystem.out:Ljava / IO /のPrintStream;
  #2 =#36 //ストリング-これはmain()メソッド---
  .......
  #52 println UTF8 =
  V;#= 53は、UTF8(Ljava /ラング/文字列)
{
// ---フィールド情報
  静的INT最終constantIntは、
    記述子:I
    ACC_STATIC、ACC_FINAL:フラグ
    一定値は:12 INTがあります


  静的int型variableInt。
    記述:I
    フラグ:ACC_STATIC


// ---方法信息
  公共の静的な無効メイン(java.lang.Stringで[])。
    記述子:([Ljava /ラング/文字列;)Vの
    フラグ:ACC_PUBLIC、ACC_STATIC
    コード:
      スタック= 2、地元= 1、args_size = 1
        0:getstatic#1 //フィールドのJava / LANG /のSystem.out:Ljava / IO / PrintStream。
        3:LDC#2 //文字列-这方法---)(主是
        5:INVOKEVIRTUAL#3 //メソッドのJava / IO / PrintStream.println:(Ljava /ラング/文字列;)V
        8:戻り
      LineNumberTable:
        ライン11:0
        行13:8

 
  公共ClassTestは();
    記述子:()Vの
    フラグ:ACC_PUBLIC
    コード:
      スタック= 1、地元の人々は= 1、args_size = 1
        0:aload_0
        1:invokespecial#5 //メソッドのjava / langは/オブジェクト"の<init>" :()V。
        4:リターン
      LineNumberTable:
        行22:0
        行24:4
       
// -スーパー()方法
  静的{}。
    記述子:()は、V
    フラグ:ACC_STATIC
    コード:
      スタック= 1、地元= 0、args_size = 0
        0:bipush 12
        2:putstatic#8 //フィールドvariableInt:I
        5:LDC#9 //文字列我很好
        7:putstatic#10 //フィールドvariableString:Ljava / LANG /文字列。
        10:戻り
      :LineNumberTable
        行5:0
        行6:5
}

クラスファイルのコンテンツアイテム

魔法(マジックナンバー):クラスファイルのニブルの前には、必ずクラスファイル識別として、クラスファイル0xCAFEBABEで始まります。

minor_version / major_versionメジャーとマイナーバージョン番号、クラスファイルをロードする方法を決定するために、バージョン番号に基づいてJVM

constant_pool_count / constant_pool:定数プール

  各定数プールエントリ識別子(バイト長)から出発。型指定された時間定数の位置を特定します。

  各記号は、テーブル名は、そのconstant_utf8_info「_info」のシンボル名対応テーブルであるました

access_flage:クラスファイルを示すアクセスフラグは、クラスまたはインタフェース、およびクラスまたはインタフェース修飾子を定義します。

this_class:インデックスconstant_class_infoは、定数プールを指しています。

super_class:それは定数プールインデックスポイントです。

インターフェイス/フィールド/メソッド/属性:インデックスはまた、定数プールを指します。

XXX_count:つまり、対応する番号。

おすすめ

転載: www.linuxidc.com/Linux/2019-07/159587.htm