Агент Java запускается в отдельном потоке? - PullRequest
3 голосов
/ 18 июня 2010

Я чувствую, что это то, что я должен знать, но запускается ли Java-агент (указанный с -javaagent) в отдельном потоке? Я читал, что агент Java - это подключаемая библиотека, которая работает встраиваемой в JVM и перехватывает процесс загрузки классов , но я хочу убедиться: действительно ли он перехватывает их (что звучит так, как будто он работает в другом потоке и отслеживает загрузку классов) или он уведомлен JVM (JVM вызывает его для разрешения загрузки класса; для него нет отдельного потока)?

Опять же, у меня возникает ощущение, что я должен быть в состоянии понять это, но будьте добры ко мне, я слишком много работаю, и мой мозг как бы жарен: P

Спасибо!

1 Ответ

5 голосов
/ 18 июня 2010

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...