- - PR -
メソッドの入れ替え
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-08-20 15:00
レスありがとうございます。
なんとレスつけようかと考えて遅くなってしまいました。 結論をいうと、変更は見送り状態です。 かつのりさんのコーディングでいうと
って書けたらうれしんですが、エラーとなりますね。 | ||||||||
|
投稿日時: 2007-08-23 15:36
見送り状態とのことですが、調べてみました。
上記かつのりさんの意見には賛成ですが、興味があったので、 Javassist説明ページ http://www.csg.is.titech.ac.jp/~chiba/notes/javapress03/index.html を参考に実装を検討してみました。
のような感じで、メソッドの振る舞いを強引に変更して、クラスファイル(.classのファイル)を上書きしてくれる様子です。 (※クラスファイルを上書きしない「CtClass#toClass」というメソッドもあるようですが、ここではうまく動きませんでした。) 以下、疑問点・所感など ・もとのクラスファイルへの戻し方はどうするんだろう?もう一回コンパイル? ・ソースファイル(.java)とクラスファイル(.class)の整合性がとれない状態が発生する。 ・コード内容は特殊でわかりにくくになると思う→保守性低下と思います。 ・(自分が)クラスローダーの走り方・原理等をほぼ理解していないので、使うのはなんとなく不安がある。 てな感じと思います。研究の余地があると思ってます。 非常に有用な面白いツールとは思います。 | ||||||||
|
投稿日時: 2007-08-23 23:12
Javassistなどのバイトコード関連のツールを使う場合、
・生成したバイトコードはクラスファイルに書き込まない ・変更対象のクラスをロードする前に書き換える ・変更対象のクラスがロードされてしまう場合、そのクラスを継承したクラスを生成する という感じになります。 JDK5のInstrumentationを利用する場合、クラスのローディングをフックできるので、 ロード前のバイトコードを拡張して、変更する事が出来ますが、 JDK1.4や通常の起動を行う場合は、独自のクラスローダを作成するか、 継承クラスの生成が必須となります。 |
«前のページへ
1|2|3