2011-01-28 5 views
4

Java JVMを再起動せずに、インストルメンテーションコードをJavaクラスファイルに複数回動的に追加および削除したいとします。これは可能ですか?すでに実行中のインスタンスのJavaクラスのコードを変更するにはどうすればよいですか?

+1

いいえ、これは深刻なセキュリティ上および設計上の欠陥です。 – leppie

+1

- "これは可能ですか?"、 "いいえ、それは設計上の欠陥です。" ??? – aioobe

+2

@leppieそれは可能ですが、必ずしもセキュリティ上の瑕疵ではありません(SecurityManager'sのことを聞いたことがあります)、それは必ずしも設計上の欠陥(AspectJについて聞いたことがありません) – adamax

答えて

7

java.lang.instrument package、特にClassFileTransformerをご覧ください。

はここで良い記事です:Instrumentation: Modify Applications with Java 5 Class File Transformations

実際のバイトコード生成のために、私はあなたがそのようなBCELASMなどのライブラリを見てお勧めします。

JRebelフレームワークでも興味があります。メソッド本体の実装を変更し、メソッドとコンストラクタの追加/削除、フィールドの追加/削除、クラスの追加/削除などをすべて実行時に行うことができます。

+0

+1 JRebelは興味深いようですが、その目的は直感的ではありません。 – leppie

+1

@leppie、私は、例えば、Webアプリケーションを開発し、連続したリクエストの間に変更を有効にすることが非常に便利であることを保証します。 – aioobe

2

実行時に別のヘルパークラス(戦略デザインパターン)にスワップされる可能性のあるヘルパークラスを使用できます。

0

また、ByteManをJBossから参照してください。これは同じJavaエージェントメカニズムを使用し、特に修正スクリプトのインストールとアンインストールをサポートしています(を参照)。

$ jps 
15295 Jps 
4884 main 

私たちは、その後、実行中のプロセスにByteManインストールすることができます:たとえば

我々はいくつかの実行中のJavaプロセスを持って言うことができます。以下は、チュートリアルの要約版がある

$ bminstall.sh 4884 

ます

$ youreditor thread.btm 
RULE trace thread start 
CLASS java.lang.Thread 
METHOD start() 
IF true 
DO traceln("*** start for thread: "+ $0.getName()) 
ENDRULE 

次に、ByeManスクリプトをインストールすることができますスクリプトを使って:

$ bmsubmit.sh -l thread.btm 

は削除するには、次の

$ bmsubmit.sh 

は、Windows上で実行されている場合は、.SHを交換:

$ bmsubmit.sh -u thread.btm 

は現在、引数を指定せずにそれを発行するだけで実行されているものを一覧表示するには各コマンドで.batを使用します。

1

Jrebelをホット・デプロイメントに使用できます。サーバーを再起動せずにコードを変更することができます。

関連する問題