9

システム クラス (FileInputStream/FileOutputStream) にカスタム動作を追加しようとしています。次の変換メソッドを使用して、カスタム ClassFileTransformer を作成しました。

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");
}

システム クラスがトランスフォームに渡されていないことがわかります。

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

4

1 に答える 1

10

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

于 2010-11-29T10:41:33.450 に答える