- 936 名前:デフォルトの名無しさん mailto:sage [2006/03/24(金) 00:52:12 ]
- >>933
InstrumentationにClassFileTransformerを追加しておくと、 クラスローダのdefineClassが実行される前に実行してくれる。 defineClassが実行される直前ではクラスのバイト列が既に解決済みなんだけど、 そのバイト列と対象のクラスローダがClassFileTransformerに渡される。 そのバイト列をClassFileTransformerで変換して返す事によって、 defineClassが本来とは違うバイト列で行われるっていうだけ。 で、GC可能なカスタムクラスローダで読み込んでいれば、 ロード済みのクラスもGCの対象になるので、GC後であれば再定義は可能だけど、 基本的には1度しか実行されないので、動的言語サポートとはいえない。 上でも説明が出てたけど、1度きりのロードだけなので、 コードカバレッジの計測とかアスペクトの組み込み等がいいかも。 OracleのTopLinkも使っていたような気がする。 あっ、でもプロパティ次第では動的に再定義も可能なんだけど、 Instrumentation関連で使用されるクラスは無理。 環境によってはサポートされない場合もある。 複数のClassFileTransformerを登録できるので、 オリジナルのバイト列 > コードカバレッジ計測機能付きバイト列 > アスペクト組み込みバイト列 > クラスローダでロード ってシナリオも可能。 TigerならApache BCELが内部に組み込まれているので、 それを使ってもいいし、俺はJavassistを使っている。 CtMethod#instrumentで、コードカバレッジの計測コードの追加が とても簡単なんだよね。
|

|