Skip to content

バイトコード完全ガイド

Javaバイトコードの構造と理解方法を、実務で使える実装例とベストプラクティスとともに詳しく解説します。

バイトコードは、Javaソースコードをコンパイルした中間表現です。

Javaソースコード (.java)
↓ javac(コンパイラ)
Javaバイトコード (.class)
↓ JVM(実行時)
ネイティブコード(実行)
  • プラットフォーム非依存: どのプラットフォームでも同じバイトコード
  • JVMで実行: JVMがバイトコードを解釈・実行
  • 最適化: JITコンパイラによる最適化
Terminal window
# クラスファイルの逆アセンブル
javap MyClass
# バイトコードを表示
javap -c MyClass
# 詳細情報を表示
javap -v MyClass
# プライベートメンバーも表示
javap -p MyClass
// ソースコード
public class Example {
private int value;
public void setValue(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
Terminal window
# バイトコードの確認
javap -c Example
# 出力例:
# Compiled from "Example.java"
# public class Example {
# public Example();
# Code:
# 0: aload_0
# 1: invokespecial #1 // Method java/lang/Object."<init>":()V
# 4: return
#
# public void setValue(int);
# Code:
# 0: aload_0
# 1: iload_1
# 2: putfield #2 // Field value:I
# 5: return
#
# public int getValue();
# Code:
# 0: aload_0
# 1: getfield #2 // Field value:I
# 4: ireturn
# }
バイトコード命令の種類
├─ ロード命令(load)
├─ ストア命令(store)
├─ 算術演算命令(arithmetic)
├─ 制御命令(control)
└─ メソッド呼び出し命令(invoke)
// ローカル変数のロード
iload_0 // int型のローカル変数0をロード
iload_1 // int型のローカル変数1をロード
aload_0 // 参照型のローカル変数0をロード
// ローカル変数へのストア
istore_0 // int型の値をローカル変数0にストア
astore_0 // 参照型の値をローカル変数0にストア
// 算術演算
iadd // int型の加算
isub // int型の減算
imul // int型の乗算
idiv // int型の除算
// メソッド呼び出し
invokevirtual // インスタンスメソッドの呼び出し
invokestatic // 静的メソッドの呼び出し
invokeinterface // インターフェースメソッドの呼び出し
invokespecial // コンストラクタやprivateメソッドの呼び出し
クラスファイルの構造
├─ マジックナンバー(0xCAFEBABE)
├─ バージョン情報
├─ 定数プール
├─ アクセスフラグ
├─ クラス情報
├─ インターフェース情報
├─ フィールド情報
├─ メソッド情報
└─ 属性情報
// ソースコード
public void loop() {
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
}
Terminal window
# バイトコード
javap -c Example
# 出力例:
# public void loop();
# Code:
# 0: iconst_0 // 0をスタックにプッシュ
# 1: istore_1 // ローカル変数1(i)にストア
# 2: iload_1 // iをロード
# 3: bipush 10 // 10をスタックにプッシュ
# 5: if_icmpge 19 // i >= 10なら19へ
# 8: getstatic #3 // System.outを取得
# 11: iload_1 // iをロード
# 12: invokevirtual #4 // printlnを呼び出し
# 15: iinc 1, 1 // iを1増やす
# 18: goto 2 // 2へ戻る
# 21: return

バイトコード完全ガイドのポイント:

  • バイトコード: Javaの中間表現
  • javap: バイトコードの逆アセンブル
  • バイトコード命令: ロード、ストア、算術演算、メソッド呼び出し
  • クラスファイル構造: マジックナンバー、定数プール、メソッド情報
  • 実践的分析: javapによるバイトコードの確認

適切なバイトコードの理解により、JVMの動作を深く理解できます。