そういえば、クラスローダー周りのことって全然知らん。
http://www-6.ibm.com/jp/developerworks/java/030704/j_j-dyn0429.html
先のJavassistを触っていたら、クラスローダーの話が出てきて気付いた。
そういえば、クラスローダー関連のことって全然しらんわ。
ということで、上記のDeveloperWorksの記事を読んでみる。
以下は読んだときのメモ。
クラスのバイナリー形式
- バイナリー・クラス・フォーマットの定義→JVMの仕様
- ソースがどんなものでも、最終的に正しいフォーマットに変換されればJVMはOK。
- クラスファイルの先頭は"cafe babe"。。
- これで言っている属性ってTigerで言ってるMetadata Facilityのこと?
クラスのロード
- クラスのリンクは、JVMがクラスをメモリにろーどするとき
- クラスのロードの規則もJVM仕様
- クラスがロードされるとjava.lang.Class オブジェクトが構築される。
- Javaクラス・ライブラリーの基本的なクラス群(ブートクラスパスにあるクラス)をロードするためのブートストラップ・クラス・ローダー
- Java拡張APIによってクラスをロードするための拡張 クラス・ローダー
- 一般的なクラスパスからクラスをロードするためのシステム・クラス・ローダー
- アプリケーションも、特別な用途に、独自のクラス・ローダーを定義できる
- 構築されたクラスは、それをロードしたクラス・ローダーが「所有」
- ブートストラップ・ローダーをルートとするクラス・ローダーのツリーを定義
- クラスロード時には親がすでにロード済みであるかをチェックする。
- あるクラスが複数のクラス・ローダーによってロードされてるときは一番上に位置するクラス・ローダーが、そのクラスを実際にロード
- java.lang.ThreadのsetContextClassLoader メソッドと getContextClassLoader
- 親クラスローダーでロードされているクラスは、子クラスローダーのクラスを直接名前で呼び出せない。