使用提供的类文件重定义提供的类集。
此方法用于替代类的定义,而不引用现有的类文件字节,这与 fix-and-continue 调试过程中重新编译源代码时所做的一样。需要转换现有类文件字节的地方(例如,字节码检测中)应该使用 retransformclasses
。
此方法在一个集合上操作,以便允许同时对多个类进行相互依赖的更改(重定义类 a 要求重定义类 b)。
如果重定义的方法有活动的堆栈帧,那么这些活动的帧将继续运行原方法的字节码。将在新的调用上使用此重定义的方法。
此方法不会引起任何初始化操作,jvm 惯例语义下发生的初始化除外。换句话说,重定义一个类不会引起其初始化方法的运行。静态变量的值将与调用之前的值一样。
重定义类的实例不受影响。
重定义可能会更改方法体、常量池和属性。重定义不得添加、移除、重命名字段或方法;不得更改方法签名、继承关系。在以后的版本中,可能会取消这些限制。在应用转换之前,类文件字节不会被检查、验证和安装。如果结果字节错误,此方法将抛出异常。
如果此方法抛出异常,则不会重定义任何类。
此方法旨在用于检测,正如类规范所述。
- 参数:
definitions
- 要使用相应定义来进行重定义的类数组;允许长度为 0 数组,在这种情况下,此方法不执行任何操作
- 抛出:
unmodifiableclassexception
- 如果无法修改指定的类(ismodifiableclass(java.lang.class>)
返回 false
)
unsupportedoperationexception
- 如果 jvm 的当前配置不允许重定义(isredefineclassessupported()
为 false)或重定义试图做出不受支持的更改
classformaterror
- 如果数据不包含有效类
noclassdeffounderror
- 如果类文件中的名称与类名称不相等
unsupportedclassversionerror
- 如果类文件版本号不受支持
classcircularityerror
- 如果新类包含循环
linkageerror
- 如果发生链接错误
nullpointerexception
- 如果提供的定义数组或其任何组件为 null
。
classnotfoundexception
- 不会抛出(存在只是为了兼容)- 另请参见:
isredefineclassessupported()
,
addtransformer(java.lang.instrument.classfiletransformer, boolean)
,
classfiletransformer