1. 若agent与应用程序同时启动,
a. agent类将由System Class Loader来装载
b. 如果agent不能装载,那么应用程序也不能启动
c. 如果agent的premain方法抛异常,应用程序也会被强制退出
2.ClassFileTransformer的 transform 发生在三种场合:
a. when classes are defined (当ClassLoader.defineClass()调用时 (这个方法把字节码对应的byte[]变成Class对象))
b. when classes are redefined (当Instrumentation.redefineClasses()被调用时)
c. when classes are retransformed (当Instrumentation.retransformClasses()被调用时) (if canRetransform is true)
注意:servlet容器重启Context时会触发ClassLoader.defineClass(),从而触发ClassFileTransformer.transform();如果某class在重启之前就已经被transform()过,这时就会再做一次transform();如果transform()的内容是添加一个方法,这时就会把方法再增添一次,造成一个类里有两处重名的方法,从而导致编译错误
3. Class Loading有好几步,transform则会发生在字节码校验verfication之前
4. 一个agent可以有多个transformer,各个transformer会依次执行。即使其中一个transformer抛出异常,下一个transformer也仍然会执行
5. 关于异常
a.若agent在应用启动后才启动,如果异常一直往外抛没有处理,控制台并不会自动打印这个异常 (通过实验证明,文档并无描述)
b.若agent与应用程序一起启动,则…(待研究)