2010-06-18 4 views
3

Je pense que c'est quelque chose que je devrais savoir, mais un agent java (spécifié avec -javaagent) s'exécute-t-il dans un thread séparé? J'ai lu cela a Java agent is a pluggable library that runs embedded in a JVM and intercepts the classloading process, mais je veux m'assurer: est-ce vraiment intercepter eux (ce qui sonne comme s'il s'exécute dans un autre thread et de surveiller les charges de classe) ou est-il notifié par la JVM (la JVM l'invoque pour résoudre le charge de classe, il n'y a pas un fil séparé pour cela)?Un agent Java s'exécute-t-il dans un thread séparé?

Encore une fois, je le sentiment que je devrais être capable de le comprendre, mais être gentil avec moi, je travaille trop dur et mon cerveau est un peu frit: P

Merci!

Répondre

5

ClassFileTransformer est appelé par ClassLoader. Une petite modification du transformateur de l'article que vous avez lié à ressembler à ceci:

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

cède cette sortie:

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) 
+0

Grand, merci. Façon très intelligente de savoir, btw :). Merci de l'avoir essayé! – Alix

Questions connexes