レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

Javaバイトコードを読む人

Javaバイトコードを読む練習です。

まずは、バイトコードを読むことが出来るプラグインは例えば以下です。

エクリプス■Bytecode Outline plugin
http://eclipsewiki.net/eclipse/?Bytecode%20Outline%20plugin

Jarファイルをダウンロードしてpluginディレクトリに入れるだけ。

使い方も簡単。
[ウィンドウ] - [ビューの表示] - [その他] でビューの表示ウィンドウが開くので[Bytecode Outline]を選択。
あとはJavaファイルを変更するとダイナミックに変更されます。

さて、ちょっと試しに。以下のTestクラスを作ってみます。

構成 名前
クラス net.kronos_jp.guice.Test
フィールド message
メソッド String getMessage()
void setMessage(String message)

Javaコード

package net.kronos_jp.guice;

public class Test{
	private String message;

	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
	
}

このクラスのバイトコードは以下。

バイトコード

// class version 49.0 (49)
// access flags 33
public class net/kronos_jp/guice/Test {

  // compiled from: Test.java

  // access flags 2
  private Ljava/lang/String; message

  // access flags 1
  public <init>()V
   L0
    LINENUMBER 13 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init>()V
    RETURN
   L1
    LOCALVARIABLE this Lnet/kronos_jp/guice/Test; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 1
  public getMessage()Ljava/lang/String;
   L0
    LINENUMBER 17 L0
    ALOAD 0
    GETFIELD net/kronos_jp/guice/Test.message : Ljava/lang/String;
    ARETURN
   L1
    LOCALVARIABLE this Lnet/kronos_jp/guice/Test; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 1
  public setMessage(Ljava/lang/String;)V
   L0
    LINENUMBER 20 L0
    ALOAD 0
    ALOAD 1
    PUTFIELD net/kronos_jp/guice/Test.message : Ljava/lang/String;
   L1
    LINENUMBER 21 L1
    RETURN
   L2
    LOCALVARIABLE this Lnet/kronos_jp/guice/Test; L0 L2 0
    LOCALVARIABLE message Ljava/lang/String; L0 L2 1
    MAXSTACK = 2
    MAXLOCALS = 2
}

なんか、読めなくもないですね。

それぞれのコマンドをちゃんと調べてみようと思います。(追々)