Java探针技术-retransformclasses的介绍
Posted 李博/Alexの技术海洋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java探针技术-retransformclasses的介绍相关的知识,希望对你有一定的参考价值。
retransformclasses
void retransformclasses(class... classes)
throws unmodifiableclassexception
- 重转换提供的类集。
-
此函数为检测已加载类提供了方便。 当最初加载了类或重定义了类时,初始类文件字节可以使用
classfiletransformer
转换。 此函数返回转换进程(以前是否发生过转换)。 此转换按以下步骤进行:从初始类文件字节开始
对于每个添加时
canretransform
设为 false 的转换器,上一次类加载或重定义期间transform
返回的字节将被重新用于转换的输出;注意,这等价于不做更改地重新应用前一个转换;没有调用transform
的情况除外。对于每个添加时
canretransform
设为 true 的转换器,在这些转换器中调用transform
方法转换的类文件字节将作为类的新定义安装
转换的顺序在
transform
方法中描述。在自动重新应用不可重转换的转换时,也将使用这一顺序。最初的类文件字节表示(应用转换前)传递给
classloader.defineclass
或redefineclasses
的字节,但有可能不完全匹配。常量池的布局或内容可能不同。常量池的条目可能多一些或少一些。常量池条目的顺序可能不同,但是,方法字节码中常量池的索引将是对应的。一些属性可能不存在。在顺序没有意义的地方(例如,方法的顺序),可能不保留顺序。此方法在一个集合上操作,以便允许同时对多个类进行相互依赖的更改(重转换类 a 要求重转换类 b)。
如果重转换的方法有活动的堆栈帧,那么这些活动的帧将继续运行原方法的字节码。重转换的方法将用于新的调用。
此方法不会引起任何初始化操作,jvm 惯例语义下发生的初始化除外。换句话说,重定义一个类不会引起其初始化方法的运行。静态变量的值将与调用之前的值一样。
重转换类的实例不受影响。
重转换可能会更改方法体、常量池和属性。重转换不得添加、移除、重命名字段或方法;不得更改方法签名、继承关系。在以后的版本中,可能会取消这些限制。在应用转换之前,类文件字节不会被检查、验证和安装。如果结果字节错误,此方法将抛出异常。
如果此方法抛出异常,则不会重转换任何类。
此方法旨在用于检测,正如类规范所述。
- 参数:
classes
- 要转换的类数组; 允许长度为 0 数组,在这种情况下,此方法不执行任何操作- 抛出:
unmodifiableclassexception
- 如果不能修改指定的类(ismodifiableclass(java.lang.class>)
返回false
)unsupportedoperationexception
- 如果 jvm 的当前配置不允许重转换(isretransformclassessupported()
为 false),或者重转换试图做出不受支持的更改classformaterror
- 如果数据不包含有效的类noclassdeffounderror
- 如果类文件中的名称不等于类的名称unsupportedclassversionerror
- 如果类文件版本号不受支持classcircularityerror
- 如果新类包含循环linkageerror
- 如果发生链接错误nullpointerexception
- 如果提供的类数组或其任意组件为null
。
- 从以下版本开始:
- 1.6
- 另请参见:
isretransformclassessupported()
,addtransformer(java.lang.instrument.classfiletransformer, boolean)
,classfiletransformer
以上是关于Java探针技术-retransformclasses的介绍的主要内容,如果未能解决你的问题,请参考以下文章
instrumentation.retransformClasses() 抛出致命错误
Java综合专栏「引领序幕」全链路追踪原理之Java Agent探针的技术介绍(上篇)