プロファイラの機能が使いたくて、久々に NetBeans を入れてみる。もう、6.0.1 というバージョンになっていたのね。前にいじったのは 5 くらいのと気だったような気が。やりたかったのは、Jetspeed2 をプロファイラで見たかったので、Tomcat に対してできれば良いという感じでしたが、設定自体はすごく簡単でした。catalina.sh の書き換えも NetBeansがやってくれるので、ほとんど、指示通りにやれば準備が完了する。っで、いざ実行したのだけど、Jetspeed2 のメモリのプロファイリングをしようとしたのだけど、Jetspeed が起動するところで突然クラスの読み込みとか止まる・・・(サーブレットの初期化しているあたりだろうか)。というわけで使えなかった(っていうか、netbeans のどこのログを見ればいいのだろうか・・・)。また、時間があるときに調べよう。
カテゴリー: Java
クラスの初期化
復習中・・・。
class Super {
static { System.out.print("Super "); }
}
class One {
static { System.out.print("One "); }
}
class Two extends Super {
static { System.out.print("Two "); }
}
class Test {
public static void main(String[] args) {
One o = null;
Two t = new Two();
System.out.println((Object)o == (Object)t);
}
}
とあって、java Test を実行したときの出力結果は?
説明は http://java.sun.com/docs/books/jls/third_edition/html/execution.html#44667 です。
クラスの読み込み?
ちょっと理解できていない現象に遭遇しているのだけど、ウェブアプリで次のようなクラスとインターフェースを作成する。
public interface TestOne {
public final static String KEY = "1234";
}
public class TestTwo implements TestOne {
...(KEYを使う)
}
で、インターフェースの TestOne を WEB-INF/classes に、クラスの TestTwo を WEB-INF/lib/hoge.jar に入れる。そして、Tomcat を起動して、普通に KEY にアクセスできることを確認する。そして、Tomcat を止めて、TestOne の KEY の値を変更して、コンパイルして、WEB-INF/classes に置く。それから、Tomcat を起動する。っで、TestTwoでKEYを使うと前のまま。はてなぜだろう・・・。流れをまとめると、
- Tomcat を起動
- KEYを確認
- Tomcat を停止
- TestOne を更新、コンパイル、上書き
- Tomcat を起動
- KEYを確認(でも、前のまま)
っていう感じなのだけど。TestTwo がある hoge.jar を更新すると有効になるみたい。Java本体なのか、Tomcatなのか、よくわからないけど、キャッシュみたいのをしているのかね・・・。何が原因かはわからないけど、面白い現象だな。
という感じで、理解できていないので、とりあえず、Java Language SpecificationのCHAPTER 12 Executionあたりを読んで、基礎を再学習中・・・。