[讨论] 关于Instrumentation 重转换类的问题
zhxing
2012-07-31
在看Instrumentation 的时候,有几个不明的地方,请教下各位。
当我利用Instrumentation 对类A进行重转换,并对类A进行了字节码修改。如果需要还原类A,我该怎么实现? 网上有个做法是先remove ClassFileTransformer 然后再直接调用重转换函数: inst.retransformClasses(A.class); 即可还原为原始未修改的状态。。原理是?? 个人猜测:该函数的执行流程是 1、从classpath中加载类A。。 2、执行已添加的ClassFileTransformer。。 不知道猜测的对不对。 该API我也未能理解透彻,请指教。 |
|
RednaxelaFX
2012-07-31
zhxing 写道 个人猜测:该函数的执行流程是 1、从classpath中加载类A。。 2、执行已添加的ClassFileTransformer。。
不知道猜测的对不对。 不对。请仔细阅读文档 规范没有具体规定要如何实现,不过像HotSpot VM的话就是在加载完(或redefine完)一个类之后会把它的Class“文件”内容缓存在内存里,当要做retransform的时候会将这个内容传给transformer(而不需要重新从classpath去找那个Class文件)。 retransform总是从最初的Class“文件”内容开始,按顺序找到适用于这个类的transformer去做变换,然后把最终变换完的那个byte数组作为结果。 如果没有适用于这个类的transformer存在,那么对这个类做retransform自然就等于将它恢复到最近的一次加载或redefine的状态。就这么简单。 |
|
zhxing
2012-07-31
RednaxelaFX 写道 zhxing 写道 个人猜测:该函数的执行流程是 1、从classpath中加载类A。。 2、执行已添加的ClassFileTransformer。。
不知道猜测的对不对。 不对。请仔细阅读文档 规范没有具体规定要如何实现,不过像HotSpot VM的话就是在加载完(或redefine完)一个类之后会把它的Class“文件”内容缓存在内存里,当要做retransform的时候会将这个内容传给transformer(而不需要重新从classpath去找那个Class文件)。 retransform总是从最初的Class“文件”内容开始,按顺序找到适用于这个类的transformer去做变换,然后把最终变换完的那个byte数组作为结果。 如果没有适用于这个类的transformer存在,那么对这个类做retransform自然就等于将它恢复到最近的一次加载或redefine的状态。就这么简单。 谢谢RednaxelaFX回答,明白了。我理解的“从初始类文件字节开始 ”是已修改后的,所以没搞明白。。 ![]() |