[讨论] 关于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回答,明白了。我理解的“从初始类文件字节开始 ”是已修改后的,所以没搞明白。。
Global site tag (gtag.js) - Google Analytics