Javaクラス解析機を作る 10日目
メソッドのコード属性の読み込みに対応。コード属性の属性として付与される、ローカル変数属性、行番号属性、例外テーブル属性もまとめて実装しました。
ここまでの解析コード
動作サンプル
解析対象クラス(のソース)。
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 } }