2010-11-29 2 views
8

システムビヘイビア(FileInputStream/FileOutputStream)にカスタムビヘイビアを追加しようとしています。私はこの方法を変革以下でカスタムClassFileTransformerを書いた:Javaシステムクラスをインストルメントする方法は?

public byte[] transform(ClassLoader arg0, String arg1, Class arg2, ProtectionDomain arg3, byte[] arg4) throws IllegalClassFormatException { 
    System.out.println("class name: " + arg1); 
    return arg4; 
} 

私はサンプルプログラムを実行すると:

public static void main(String[] args) throws Exception { 
    new FileOutputStream("file"); 
} 

を私はシステムクラスを変換するために渡されていないされていないことがわかります。

システムクラスを変更する方法はありますか?前もって感謝します!

+0

私は、プロファイラのような多くのツールがこの振舞いに依存しているので、システムクラスが渡されると期待しています。 –

+0

多くのツールの問題を避けるために、いくつかのClassFileTransformerを追加することができます。クラスを変換する方法については、スタンドアート/ガイドライン/推奨事項があります。 – dernasherbrezon

答えて

9

メインクラス前のメソッドが呼び出され、ClassFileTransformerが追加される前に、一部のシステムクラス(すべてではない)がロードされています。これらのクラスも変換したい場合は、ClassFileTransformerを追加した後に、Instrumentation#retransformClasses(Instrumentation#getAllLoadedClasses())のようなものを呼び出すことができます。トランスフォーマーがクラスの再変換をサポートしていることを示すには、Instrumentation#addTransformer(ClassFileTransformer、true)を使用する必要があります。

+0

クラスは、変更可能かどうかをチェックする必要がありますので注意してください:Instrumentation.isModifiable – dernasherbrezon

+0

ありがとう@jarnbjo、私はこのようなものを探していました - http:// stackoverflow .com/questions/20282619/using-instrumentation-to-record-unhandled-exception/20283771#20283771 –

関連する問題