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

instrumentation.redefineClasses(def)

  • 英文含义
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 - 不会抛出(存在只是为了兼容)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,463评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,627评论 25 709
  • 牛顿和爱因斯坦都是迄今为止最伟大的物理学家, 前者是经典物理的代表,后者则是现代物理学的开拓者。 牛顿主要的贡献是...
    科学认识论阅读 7,675评论 1 12
  • 可惜的惜 爱惜的惜 晨曦的曦
    橙浅阅读 669评论 0 0
  • 一、Chrome浏览器有快、美、大的特点,以占内存和硬盘大为代价使其速度快 二、一般用户使用chrome会用到的功...
    林正正正阅读 3,570评论 1 1