2010-06-18 35 views
3

我觉得这是我应该知道的,但是java代理(用-javaagent指定)在单独的线程中运行?我读过a Java agent is a pluggable library that runs embedded in a JVM and intercepts the classloading process,但我想确认:是否真的拦截了它们(听起来像是在另一个线程中运行并监视类加载),还是由JVM通知(JVM调用它来解析类加载;它没有一个单独的线程)?java代理是否在单独的线程中运行?

再次,我得到我应该能够弄清楚,但对我很好的感觉,我的工作太辛苦,我的大脑有点炸:P

谢谢!

回答

5

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

很好,谢谢。非常聪明的方式来找出,顺便说一句:)。感谢您的尝试! – Alix 2010-06-18 16:02:34

相关问题