Search on the blog

2012年8月4日土曜日

Reading Java RunTime Source Code (1)

はじめに
コードを読む能力/綺麗なコードを書く能力を鍛えるため、Java RunTimeのソースコードを読んでいくことにした。まずは、動的な解析をするための環境を整えた。

ソースの取得
ソースコードが無かったので、以下のコマンドで取得した。
$ sudo apt-get install openjdk-7-source 
これで、/usr/lib/jvm/java-7-openjdk-commonにsrc.zipというzipファイルができる。ここにソースファイルが格納されている。このsrc.zipのソースをコンパイルして、jarにまとめたものが/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jar。

開発環境構築
~/codereading/javaというディレクトリを作成し、そこにsrc.zipを解凍。rt.jarをコピーして持ってきて、jarファイルの中身を取り出して、bin配下に格納した。最終的に以下のようなディレクトリ構成にした。
- codereading
    - java
          - rt.jar
          - src
              - (ソースコード)
          - bin
              - (クラスファイル)
              - META-INF
                  - MANIFEST.MF

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/rt.jarの実体は削除して、上記のrt.jarへのシンボリックリンクにした。これで、ソースコードを適当にイジってコンパイルしてjarファイルを更新すれば、JVMがロードするクラスの内容も変わるはず。

確認
java.lang.Boolean.javaを少し変えて
public Boolean(boolean value) {
    this.value = value;
    System.out.println("Boolean Constructor Invoked.");
}
コンパイル。
~/codereading/java$ javac src/java/lang/Boolean.java -d bin
jarファイルも更新。
~/codereading/java/bin$ jar cmf META-INF/MANIFEST.MF test.jar *
~/codereading/java/bin$ mv test.jar ../rt.jar
テスト用のクラスを書く。
public class Main {
    public static void main(String[] args) {
        System.out.println("Start.");
        Boolean bool = new Boolean(true);
        System.out.println("End.");
    } 
}
以下が実効結果。
Boolean Constructor Invoked.
Boolean Constructor Invoked.
Start.
Boolean Constructor Invoked.
End.
よし、これでソースを読むための最低限の準備はできた!

0 件のコメント:

コメントを投稿