Java探针技术-instrutment中retransformClasses和redefineClasses
2023-02-18 16:23:37 时间
retransformClasses:已经加载的类重新进行转换处理,即会触发重新加载类定义,需要注意的是,新加载的类不能修改旧有的类声明,譬如不能增加属性、不能修改方法声明 redefineClasses:与如上类似,但不是重新进行转换处理,而是直接把处理结果(bytecode)直接给JVM
总结:
class文件随着虚拟机启动的时候,会经过premain方法,premain方法中定义了transform,这个premain在虚拟机启动的时候会被执行一次,然后通过transform方法对类进行了修饰,就好像被穿了一件衣服,class加载的时候注入了transform中的内容,以后每次class执行的时候就会走一次transform里面的东西,就好下你给之前给你穿了一个衣服,以后每次看你你都穿着这个衣服。
retransformClasses是因为agent虽然嵌入了,但是在虚拟机启动的时候,某些类比如thread,在javaagent启动之前就已经加载到了内存,javaagent也是类,在javaagent加载之前虚拟机需要加载一些必须的类来保证我的javaagent的运行,比如说thread,这个时候thread就没有被”穿上衣服“,即没有被transform修饰,也就不能被javaagent监控到,这个时候就需要retransformClasses重新加载,注意retransformClasses会让没有被”穿上衣服的类”穿上衣服“
redefineClasses也是重新加载一次,但是这里注意并没有给类”穿衣服“,即通过这种方法加载的时候,类不会经过transform方法。这个方法的作用类似于,原来给类”穿上了衣服“,通过这个方法可以给这个类”脱了衣服“
一个关于redefineClass的不错的博文:https://blog.csdn.net/raintungli/article/details/51655608
总的来说他们两个的共同点都是让类(class文件)重新加载进入内存,不同的是前者是为了“穿衣服”,后者是为了“脱衣服”
相关文章
- NDK开发(一) :NDK入门指南
- NDK开发(二) :JNI的数据类型
- NDK开发(三) :JNI访问Java变量和方法
- NDK开发(四) :JNI操作Java数组
- NDK开发(五) :JNI实现文件加解密
- NDK开发(六) :JNI实现文件拆分和合并
- NDK开发(七) :JNI实现文件夹遍历
- NDK开发(八) :JNI下Bitmap的使用
- NDK开发(九) :Hello jniCallback
- NDK开发(十) :Hello OpenGLES3
- 利用ClassLoader实现检查项目中不符合规范的代码
- okhttp的使用介绍
- okhttp之OkHttpClient
- okhttp之Request
- okhttp之RealCall.execute()流程介绍
- okhttp之五个拦截器的介绍
- okhttp之自定义拦截器
- okhttp之Dispatcher
- okhttp之Connection
- okhttp之ConnectionPool