ホームページ  >  記事  >  Java  >  javap を使用して Java 整定数と整数変数を解析する方法

javap を使用して Java 整定数と整数変数を解析する方法

不言
不言転載
2018-10-22 15:39:162775ブラウズ

この記事の内容は、Java の整数定数と整数変数を解析するための javap の使用方法についてです。必要な方は参考にしていただければ幸いです。

以下のコードの 5 行目と 9 行目は、それぞれ整数変数と整数定数を定義しています。

static final int number1 = 512;
static int number3 = 545;

Java プログラマーは全員、この 2 つの違いを知っています。

javap を使用して Java 整定数と整数変数を解析する方法

次に、javap を使用して .class ファイルを逆コンパイルし、Java の整数変数と整数定数の違いを詳しく調べます。

コマンド ライン javap -c constant.ConstantFolding を使用して、.class ファイルから逆コンパイルされたバイトコードを表示します。

javap を使用して Java 整定数と整数変数を解析する方法

結果:

javap を使用して Java 整定数と整数変数を解析する方法

これらのバイトコード命令の説明は、wikipedia:

wiki: https://en.wikipedia .org/ で説明されています。 wiki...

私たち Java プログラマは、これらをすべて覚える必要はありません。この Web ページを保存し、必要なときに辞書として使用するだけです。

javap を使用して Java 整定数と整数変数を解析する方法

sipush 545: 整数 545 をスタックに配置します

putstatic #16:

スタック上の値 545 を現在のクラスに割り当てます静的フィールド。

javap を使用して Java 整定数と整数変数を解析する方法

では、putstatic #16 の #16 は何を意味するのでしょうか?

javap -v パラメータを使用して逆コンパイルすると、このクラスの定数プール (定数プール) が表示されます。下の図の青色で強調表示された行を見てください:

constant/ConstantFolding。 .nu​​mber3:I

説明 #16 は、クラス constant.ConstantFolding のメンバー番号 3 を表し、型は I です。

javap を使用して Java 整定数と整数変数を解析する方法

この時点で、これら 2 行のバイトコード命令が結合され、実際に作成した Java コードに対応します:

static int number3 = 545;

javap で逆コンパイルされたバイトコードの分析を続けます。

javap を使用して Java 整定数と整数変数を解析する方法

aload_0: シリアル番号 0 のローカル変数の導入をスタックにロードします。

invokespecial: オブジェクト インスタンスのメンバーを呼び出します。メソッドに戻り値がある場合、メソッドの戻り値はスタックに格納されます。呼び出される特定のメソッドは # で識別され、対応するメソッド名を定数プールで照会できます。

ldc: コードネーム # の定数の値を定数プールからスタックにロードします。

下図の定数プール リストから、シリアル番号 #29 の定数 318976 が、整数定数 1 (512) と整数定数 (623) の積であることがわかります。このことから、式number1 *number2は、演算に関与する2つのオペランドがSTATICおよびFINALの変更を通じて整数定数になっているため、積はコンパイル時に取得できるため、コンパイラはコンパイル時に計算することがわかります。それをシーケンス番号 #29 で変数プールに保存します。

javap を使用して Java 整定数と整数変数を解析する方法

それでは、整数変数の乗算に対応するバイトコードは何でしょうか?

下の図のコード番号 3 から開始します。

getstatic #16: クラスの静的メンバー #16 をスタックにロードします。 #16 に対応するメンバーはnumber3 で、値は 545 です。

getstatic #18: クラスの静的メンバー #18 をスタックにロードします。 #18 に対応するメンバーはnumber4 で、値は 619 です。

imul: スタック上で 2 つの整数の乗算を実行します。

istore_2: 結果をローカル変数 2 に保存します。

この時点で、Java コードの int product2 =number3 *number4 が実行されています。

表示される残りの青色のバイトコードは、print ステートメントの次の行に対応します。

System.out.println("Value: " + product1 + " , " + product2);

これらのバイトコードから、Java ではプラス記号を直接使用して文字列の結合操作を実行していることがわかります。Java コンパイラは、コンパイル時に最適化のために StringBuilder を自動的に使用します。

整数変数の積を出力する必要があるため、バイトコードの iload_2 は、istore_2 でローカル変数 2 に保存しておいた計算結果をスタックにロードすることで、最後に積結果を出力することができます。

javap を使用して Java 整定数と整数変数を解析する方法

#この簡単な例を通じて、誰もが javap の使用方法を学び、Java と JVM の詳細を深く理解できることを願っています。

以上がjavap を使用して Java 整定数と整数変数を解析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。