開発ツール:家田、JDK1.8、WinHex
バイトコードファイルの構造
ソース
パッケージcom.jalja.java.bytecode。 / ** * @Auther:XL * @Date:2020年1月4日12時58分 * @description: * / パブリック クラスBytecodeTest { プライベート int型 NUM = 1 ; 公共 INT getNum(){ 戻りNUM。 } 公共 ボイド setNum(int型NUM){ この .num = NUM。 } }
分析てjavap -verbose Aバイトコードファイル、マジックナンバー情報は、ファイル、バージョン番号、定数プール、クラス情報、クラスのコンストラクタ、クラス情報、クラス変数とメンバ変数のメソッドバイトコード出力であります
F:\ワークスペース\ IDEA \研究\ jaljaベース-utilsの\ターゲット\テスト・クラス>てjavap - com.jalja.java.bytecode.BytecodeTest冗長 クラスファイル / F:/ワークスペース/ IDEA /研究/ jaljaベース-utilsの/ターゲット/テストクラス/ COM / jalja / javaの/バイトコード/ BytecodeTest。クラス 最終更新日 2020年1月4日を。サイズ514 バイトの MD5チェックサムb661c2792027e7c9169a0266523412c1 からコンパイル "BytecodeTest.java" パブリック クラスcom.jalja.java.bytecode.BytecodeTestの マイナーバージョン: 0 メジャーバージョン: 52の フラグ:ACC_PUBLIC、ACC_SUPERの 定数プール: # 1 = Methodref#4#20 / /Javaの/ LANG /オブジェクト"の<init>" :()V。 #2 =するFieldRef#3.#21 // COM / jalja / javaの/バイトコード/ BytecodeTest.num:I #3 =クラス#22 // COM / jalja /ジャワ/バイトコード/ BytecodeTest #4 =クラス#23 // のJava / LANG /オブジェクト #5 = UTF8 NUM # 6 = UTF8 I # 7 = UTF8 <初期化> # 8 = UTF8()V # 9 = UTF8コード # 10 = UTF8 LineNumberTable # 11 =UTF8 LocalVariableTable # 12 = UTF8 この # 13 = UTF8 LCOM / jalja /ジャワ/バイトコード/ BytecodeTest。 # 14 = UTF8 getNum # 15 = UTF8()I # 16 = UTF8 setNum # 17 = UTF8(I)V # 18 = UTF8 SOURCEFILE # 19 = UTF8 BytecodeTest.java # 20 = NameAndType#7:#8 // 「< INIT> ":()V #21 = NameAndType#5:#6 //NUM:I #22 = UTF8 COM / jalja /ジャワ/バイトコード/ BytecodeTest # 23 = UTF8のJava /ラング/ オブジェクト { パブリックcom.jalja.java.bytecode.BytecodeTest()。 記述子:()は、V フラグ:ACC_PUBLIC コード: スタック = 2、地元= 1、args_size = 1 0 :aload_0 1:invokespecial#1 // 。メソッドJAVA /ラング/オブジェクト"<初期化>" :()V 4 :aload_0 5 :iconst_1で 6:putfield#2 // フィールドNUM:I 9:リターン LineNumberTable: 行 8:0 行 9:4 LocalVariableTable: スタート長スロット名署名 0 10 0 この LCOM / jalja /ジャワ/バイトコード/ BytecodeTest。 公共 int型getNum(); 記述子:()のI フラグ:ACC_PUBLIC コード: スタック = 1、地元= 1、args_size = 1 0 :aload_0 1:GETFIELD#2 // フィールドNUM:I 4 :ireturn LineNumberTable: 行 12:0 LocalVariableTable: スタートの長さのスロット名の署名 0 5 0 この LCOM / jalja / javaの/バイトコード/ BytecodeTest。 公共 のボイド setNum(int型); 記述子:(I)Vの フラグ:ACC_PUBLIC コード: スタック = 2、地元= 2、args_size = 2 0 :aload_0 1 :iload_1 2:第2位putfield // フィールドnumは:I 5:戻り LineNumberTable: 行 16:0 ライン 17 :5 LocalVariableTable: スタートの長さのスロット名の署名 0 6 0 この LCOM / jalja / javaの/バイトコード/ BytecodeTest。 0 6 1 NUM I } SOURCEFILE: "BytecodeTest.java"
WinHex:オープンクラスファイル
第二に、マジックナンバー
1、マジックナンバー:すべてのクラスのバイトコードファイルの最初の4つのバイトはマジックナンバーであり、マジック番号は、データが準拠クラスローディングであること固定値0XCAFEBABE、JVMの検証です。
第二に、バージョン番号
2、バージョン番号:
4バイトのマジックナンバー、バージョン情報、最初の2バイト(00 00)であり、マイナーバージョン番号(マイナーバージョン:0)した後、最後の2バイト(00 34)メジャーバージョン番号(メジャーバージョンである:52 )、進34進52に変換され、52は、対応するJDK1.8であり; = 1.8.0クラスファイルの、したがって、バージョン番号、使用するJava -versionを検証することができます。JVMは、下位互換性があるので、ファイルのバージョン番号バイトコードあなたを行うので、どのように以下のJVMの現在のバージョンに等しいよりも、あなたは現在のJVMで実行することができます。
次のセクション:定数プールのJavaバイトコードファイル