Java探针技术-instrutment中retransformClasses和redefineClasses

 

1
2
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文件)重新加载进入内存,不同的是前者是为了“穿衣服”,后者是为了“脱衣服”

 

posted @   洛神灬殇  阅读(3708)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示