読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Javaクラス解析機を作る 10日目

Ruby Java クラス解析機

メソッドのコード属性の読み込みに対応。コード属性の属性として付与される、ローカル変数属性、行番号属性、例外テーブル属性もまとめて実装しました。

ここまでの解析コード

→Javaクラス解析機 080421

動作サンプル

解析対象クラス(のソース)。

public class HelloWorld {
    public static void main ( String[] args ) {
    	String str = "Hello World!";
        System.out.println( str );
    }
}

解析!

require "javaclass"

[ "./java_class/HelloWorld.class" ].each { |c|
  open( c, "r+b" ) {|io|
    jc = JavaClass.from io
    puts jc.to_s
    puts ""
  }
}

実行結果です。

  • メソッドの中にローカル変数とコードを列挙するようにしてみました。
  • コードはThe Java Virtual Machine Specification - Opcode Mnemonics by Opcodeにしたがって文字列に変換してみただけ。多分、命令コードに渡す引数みたいなものも出力に混じっていると思われます。このあたりの解読は未。
  • あと、コードの末尾に行番号を出力するようにしています。
// version 50.0
// source HelloWorld.java
public class HelloWorld 
extends java.lang.Object {


    public void <init> (  ){
        HelloWorld this;
    
        aload_0 // line : 1
        invokespecial
        nop
        iconst_5
        return
    }
    public static void main ( java.lang.String[] arg1 ){
        java.lang.String[] args;
        java.lang.String str;
    
        ldc // line : 3
        bipush
        astore_1
        getstatic // line : 4
        nop
        ldc
        aload_1
        invokevirtual
        nop
        dload
        return // line : 5
    }

}