instrumentation.redefineClasses(def)
- 英文含义
翻译过来就是
-
使用提供的类文件重新定义提供的一组类。
-
该方法用于替换类的定义,而不引用现有的类文件字节,就像从源进行重新编译以进行修复和继续调试时一样。 在现有类文件字节要转换的地方(例如,在字节码检测中)应该使用retransformClasses。
一句话:在需要字节码转换的时候,直接从原路径读取类字节码,不引用内存中已经加载的字节码。 -
该方法对一组类文件进行操作,以便同时允许多个类的相互依赖的更改(A类的重新定义可能需要重新定义B类)。
-
如果重新定义的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。 重新定义的方法将用于新的调用。
也就是说,既往不咎的意思呀!!! -
该方法不会导致任何初始化,除了在常规JVM语义下会发生。 换句话说,重新定义一个类并不会导致它的初始化器被运行。 静态变量的值将保持在调用之前。
-
重新定义的类的实例不受影响。
-
重定义可能会更改方法体、常量池和属性。重定义不得添加、移除、重命名字段或方法;不得更改方法签名、继承关系。在以后的版本中,可能会取消这些限制。在应用转换之前,类文件字节不会被检查、验证和安装。如果结果字节错误,此方法将抛出异常。
-
如果此方法抛出异常,则不会重定义任何类。
-
此方法旨在用于检测,正如类规范所述。
参数:
definitions - 要使用相应定义来进行重定义的类数组;允许长度为 0 数组,在这种情况下,此方法不执行任何操作
抛出:
- UnmodifiableClassException - 如果无法修改指定的类(isModifiableClass(java.lang.Class) 返回 false)
- UnsupportedOperationException - 如果 JVM 的当前配置不允许重定义(isRedefineClassesSupported() 为 false)或重定义试图做出不受支持的更改
- ClassFormatError - 如果数据不包含有效类
- NoClassDefFoundError - 如果类文件中的名称与类名称不相等
- UnsupportedClassVersionError - 如果类文件版本号不受支持
- ClassCircularityError - 如果新类包含循环
- LinkageError - 如果发生链接错误
- NullPointerException - 如果提供的定义数组或其任何组件为 null。
- ClassNotFoundException - 不会抛出(存在只是为了兼容)
网友评论