JVM上で、バイトコード

JVM、研究では最近、割れた瓶についての話、私たちに迷惑を考えを導くために、この分野での経験を持っています..

参照

参考1つの
コマンド整理

共通コマンド

1 
2
3

逆コンパイル、クラスファイル``ビューのすべての情報
てjavap -verbose [クラス]

ローカル変数の型

特殊文字表現 タイプ 説明
C CHAR char型
int型 int型
リットル 長いです ロングタイプ
S ショート ショートタイプ
B バイト バイト型
F 浮く float型
から ブーリアン ブーリアン
A 参照 引用文

メソッドの情報

1 
2
3
4
5
L1 
のLocalVariableこのLMain。L0、L1 0
のLocalVariable I L0、L1 1
MAXSTACK = 0
MAXLOCALS = 2

ローカル変数パラメータのLocalVariable
ローカルテーブルサイズMAXLOCALS
オペランドスタックサイズMAXSTACK

命令

演算命令

2つのための演算命令操作数栈の特定の操作の値が行われ、その結果がバックに格納されている操作栈トップ。

  • 加算命令:IADD、ラッド、FADD、DADD
  • 減算命令:Isubは、LSUB、FSUB、DSUB
  • 乗算命令:IMUL、lmul、FMUL、DMUL
  • 除算命令:IDIV、ldiv、FDIV、ddiv
  • 剰余命令:IREM、lrem、FREM、drem
  • 反転命令:INEG、LENG、FNEG、dneg
  • モーションコマンド:ISHL、ishr、iushr、lshl、LSHR、lushr
  • ビット単位または命令:IOR、LOR
  • ビットAND命令:IAND、土地
  • ビットごとのXOR命令:IXOR、lxor
  • インクリメントローカル変数命令:IINC
  • 命令の比較:dcmpg、dcmpl、fcmpg、fcmpl、LCMP

ロードとストア命令

局部变量表操作数栈の間で前後に転送

  • ILOAD、iload_ <n>は、lload、lload_ <n>は、フロート、fload_ <n>は、DLOAD、dload_ <n>は、aload、aload_ <N>:ローカル変数を含む命令のオペランドスタックにロードされます。
  • ローカル変数ターゲット・オペランド命令にスタックから値を格納する:istore、istore_ <n>は、lstore、lstore_ <n>は、fstore、fstore_ <n>は、dstore、dstore_ <n>は、astore、astore_ <N>
  • bipush、sipush、LDC、ldc_w、ldc2_w、aconst_null、iconst_ml、iconst_ <I>、lconst_ <L>、fconst_ <F>、dconst_ <D>:定数オペランドスタック命令にロードされます
  • ローカル変数テーブルのインデックス命令アクセス:ワイド
    iload_は<I>のような、一連の命令を表すアングルブラケットを終了命令の一部を、そのようなiload_1、これらは汎用命令のオペランドを有する命令のセットである、iload_0を表します。

演算命令

2つのうち操作数栈、特定の操作上の値が行われ、その結果がに戻って格納されている操作栈トップ

  • 加算命令:IADD、ラッド、FADD、DADD
  • 減算命令:Isubは、LSUB、FSUB、DSUB
  • 乗算命令:IMUL、lmul、FMUL、DMUL
  • 除算命令:IDIV、ldiv、FDIV、ddiv
  • 剰余命令:IREM、lrem、FREM、drem
  • 反転命令:INEG、LENG、FNEG、dneg
  • モーションコマンド:ISHL、ishr、iushr、lshl、LSHR、lushr
  • ビット単位または命令:IOR、LOR
  • ビットAND命令:IAND、土地
  • ビットごとのXOR命令:IXOR、lxor
  • インクリメントローカル変数命令:IINC
  • 命令の比較:dcmpg、dcmpl、fcmpg、fcmpl、LCMP

型変換

2台のJava仮想マシンの数値型変換

JVMは、ワイドコンバージョンタイプ(タイプの広い範囲に小さな型変換)をサポートします。

  • 長く、float型、double型にint型
  • フロートに長いタイプ、ダブルタイプ
  • double型の浮動小数点

オブジェクトの作成と操作

クラスのインスタンスと配列はオブジェクト、別のバイトコード命令とクラスのインスタンスと配列を作成するための操作を使用するJava仮想マシンですが。

  • インスタンスを作成するためのコマンド:新しいです
  • NEWARRAY、anewarray、multianewarray:コマンドの配列を作成します。
  • 命令のアクセスフィールド:putstaticのgetField、putfield、getstatic、
  • 配列要素は、オペランドスタック命令にロードされる:baload、caload、saload、iaload、laload、faload、daload、aaload
  • オペランドスタックは、配列要素に格納された値は、実行される:bastore、castore、castore、sastore、iastore、fastore、dastore、aastore
  • 命令は、配列の長さをフェッチ:にarrayLength
  • 型チェック命令の例:instanceofは、checkcast

管理命令のオペランドスタック

直接操作命令のオペランドスタック:ポップ、POP2、DUP、dup2の、dup_x1、dup2_x1、dup_x2、dup2_x2とスワップ

注:スタックに(DUP)/ポップ・スタック(POP)

制御転送命令

  • 条件分岐:ifeq、もし大きな柱  トークJVMバイトコード LT、ifle、ifne、IFGT、 IFGE、IFNULL、ifnotnull、if_cmpeq、if_icmpne、if_icmlt、if_icmpgt など
  • 複雑な条件分岐:tableswitch、lookupswitch
  • 無条件分岐:後藤、goto_w、JSR、jsr_w、RET

メソッドの呼び出しと復帰の指示

  • INVOKEVIRTUAL命令:呼び出しオブジェクトのインスタンスメソッドは、送出され(割り当てられた仮想マシン)オブジェクトの実際のタイプに基づい。
  • invokeinterface命令:右のメソッド呼び出しを求める方法を検索するには、このインターフェイスを実装する実行時オブジェクトのインターフェイスメソッドを呼び出します。
  • invokespecial:呼び出しがあって、特別な治療インスタンスメソッド、インスタンス初期化メソッド、親プライベートメソッドや方法を必要
  • invokestatic:(静的)クラスメソッドを呼び出します
  • メソッドのリターン命令がireturn(戻り値はブール値、バイト、文字、ショート、及びINTである)、lreturn、freturn、drturnとareturn、ボイド方法のための別のリターン、インスタンス初期化メソッド、クラス、およびを含む、戻り型際立った値であります私は、クラスの初期化メソッドを使用するインタフェース。

シンクロナス

例えば:

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//クラスのバージョン52.0(52)
//アクセスフラグ0x21で
パブリッククラスメイン{

Main.java://からコンパイル

//アクセスフラグ0x11を
公共の最終I simpleField = 100

//アクセスフラグを0x0
<初期化>()V
L0
LINENUMBER 12 L0
ALOAD 0
INVOKESPECIALのJava / langは/オブジェクトの<init>()V。
L1
LINENUMBER 10 L1
ALOAD 0
BIPUSH 100
PUTFIELD Main.simpleField:I
L2
LINENUMBER 13 L2
GETSTATICのJava /lang/System.out:Ljava / IO /のPrintStream。
BIPUSH 100
INVOKEVIRTUALのJava / IO / PrintStream.print(I)V
L3
LINENUMBER 14 L3
RETURN
L4
のLocalVariableこのLMain。L0 L4 0
MAXSTACK = 2
MAXLOCALS = 1

//アクセスフラグ0x9
パブリック静的主([Ljava /ラング/文字列;)V
L0
LINENUMBER 16 L0
新しいメイン
DUP
INVOKESPECIALメイン<初期化>()は、V。
ASTORE 1
L1
LINENUMBER 17 L1
GETSTATICのJava / LANG /のSystem.out:Ljava / IO /のPrintStream。
LDC " - >"
INVOKEVIRTUALのJava / IO / PrintStream.println(Ljava /ラング/文字列;)V
L2
LINENUMBER 19個のL2
RETURN
L3
のLocalVariable引数[Ljava /ラング/文字列; L0 L3 0
のLocalVariable主LMain。L1 L3 1
MAXSTACK = 2
MAXLOCALS = 2

//アクセスフラグ0x21で
公共同期(I)Vは、Java / LANG /例外スロー
L0
LINENUMBER 23 L0
RETURN
L1
のLocalVariableこのLMainを。L0、L1 0
のLocalVariable I L0、L1 1
MAXSTACK = 0
MAXLOCALS = 2
}

おすすめ

転載: www.cnblogs.com/sanxiandoupi/p/11692153.html