そういえば、クラスローダー周りのことって全然知らん。

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
  • 親クラスローダーでロードされているクラスは、子クラスローダーのクラスを直接名前で呼び出せない。