クラスファイルは、唯一のクラスまたはインタフェースを含めることができます。
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:つまり、対応する番号。