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,当然,有其限制。
Global site tag (gtag.js) - Google Analytics