4

これは知っておくべきことだと思いますが、Java エージェント (-javaagent で指定) は別のスレッドで実行されますか? Javaエージェントは、JVMに埋め込まれて実行され、クラスロードプロセスをインターセプトするプラグ可能なライブラリであると読みましたが、確認したいのですが、本当にそれらをインターセプトしますか(別のスレッドで実行され、クラスのロードを監視しているように聞こえます)それともJVMから通知されますか(JVMはそれを呼び出してクラスの負荷を解決します。別のスレッドはありません)?

繰り返しますが、私はそれを理解できるはずだと感じていますが、私に優しくしてください。

ありがとう!

4

1 に答える 1

6

ClassFileTransformer は ClassLoader によって呼び出されます。リンクした記事のトランスフォーマーを少し変更して、次のようにします。

public byte[] transform(ClassLoader loader, String className,
        Class redefiningClass, ProtectionDomain domain, byte[] bytes)
        throws IllegalClassFormatException {
    new RuntimeException("Transformer to Transform Class: " + className)
            .printStackTrace(System.out);
    return bytes;
}

次の出力が得られます。

java.lang.RuntimeException: Transformer to Transform Class: MyMain
    at com.javalobby.tnt.instrument.SimpleTransformer.transform(SimpleTransformer.java:14)
    at sun.instrument.TransformerManager.transform(Unknown Source)
    at sun.instrument.InstrumentationImpl.transform(Unknown Source)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
于 2010-06-18T15:08:01.323 に答える