Instrumentation 的实现原理
chenk818
2012-05-31
jdk1.5引入Instrumentation,api说明
public interface ClassFileTransformer一个提供此接口的实现以转换类文件的代理。转换在 JVM 定义类之前发生。 假定我现在调用 defineClass(String name, byte[] b,int off,int len) 我在ClassLoader的源码里面没有发现Instrumentation的预调用,那是说这块逻辑是在native code里面实现的吗? |
|
iamiwell
2012-05-31
其实instrument有两个方面,一个就是transformer,另一个就是redefineClasses
两者的原理和时机都不是一样的,就拿hotspot来说吧: 如,transformer作用时机可以参照 http://hg.openjdk.java.net/jdk6/jdk6/hotspot/file/20dbc199874e/src/share/vm/classfile/classFileParser.cpp 第2872行: if (JvmtiExport::should_post_class_file_load_hook()) { JvmtiExport::post_class_file_load_hook(...) } 意思是说,如果有相关的agent钩子,在这个点会触发transformers,即在真正解析class文件之前做一个偷梁换柱,在这里,其实你可以把类改成你自己想要的样子。(另外transformer在redefineClasses时也会被用到) 至于redefineClasses你可以参照jvmti的实现,可以在运行时做hotswap,当然,有其限制。 |