一步一步来实现简单安卓性能监控SDK之两个重要函数

instrumentation.redefineClasses(def)

  • 英文含义
一步一步来实现简单安卓性能监控SDK之两个重要函数_第1张图片
instrumentation.redefineClasses.png

翻译过来就是

  • 使用提供的类文件重新定义提供的一组类。

  • 该方法用于替换类的定义,而不引用现有的类文件字节,就像从源进行重新编译以进行修复和继续调试时一样。 在现有类文件字节要转换的地方(例如,在字节码检测中)应该使用retransformClasses。
    一句话:在需要字节码转换的时候,直接从原路径读取类字节码,不引用内存中已经加载的字节码。

  • 该方法对一组类文件进行操作,以便同时允许多个类的相互依赖的更改(A类的重新定义可能需要重新定义B类)。

  • 如果重新定义的方法具有活动堆栈帧,则这些活动帧将继续运行原始方法的字节码。 重新定义的方法将用于新的调用。
    也就是说,既往不咎的意思呀!!!

  • 该方法不会导致任何初始化,除了在常规JVM语义下会发生。 换句话说,重新定义一个类并不会导致它的初始化器被运行。 静态变量的值将保持在调用之前。

  • 重新定义的类的实例不受影响。

  • 重定义可能会更改方法体、常量池和属性。重定义不得添加、移除、重命名字段或方法;不得更改方法签名、继承关系。在以后的版本中,可能会取消这些限制。在应用转换之前,类文件字节不会被检查、验证和安装。如果结果字节错误,此方法将抛出异常。

  • 如果此方法抛出异常,则不会重定义任何类。

  • 此方法旨在用于检测,正如类规范所述。

参数:
definitions - 要使用相应定义来进行重定义的类数组;允许长度为 0 数组,在这种情况下,此方法不执行任何操作
抛出:

  • UnmodifiableClassException - 如果无法修改指定的类(isModifiableClass(java.lang.Class) 返回 false)
  • UnsupportedOperationException - 如果 JVM 的当前配置不允许重定义(isRedefineClassesSupported() 为 false)或重定义试图做出不受支持的更改
  • ClassFormatError - 如果数据不包含有效类
  • NoClassDefFoundError - 如果类文件中的名称与类名称不相等
  • UnsupportedClassVersionError - 如果类文件版本号不受支持
  • ClassCircularityError - 如果新类包含循环
  • LinkageError - 如果发生链接错误
  • NullPointerException - 如果提供的定义数组或其任何组件为 null。
  • ClassNotFoundException - 不会抛出(存在只是为了兼容)

你可能感兴趣的:(一步一步来实现简单安卓性能监控SDK之两个重要函数)