はじめに
コードを読む能力/綺麗なコードを書く能力を鍛えるため、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 binjarファイルも更新。
~/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 件のコメント:
コメントを投稿