java 中 可以使用assert语法来进行一些判断检,但是 android上 assert似乎不生效, 这是为什么呢。

在将java source code编译成class文件的过程中,如果一个类中使用了assert语法,那么class文件中会生成一个static field。

final static synthetic Z $assertionsDisabled

在类的静态初始化函数,会生成以下代码

static ()V

L0

LINENUMBER 20 L0

LDC Lorg/chromium/base/JavaExceptionReporter;.class

INVOKEVIRTUAL java/lang/Class.desiredAssertionStatus ()Z

IFNE L1

ICONST_1

GOTO L2

L1

FRAME SAME

ICONST_0

L2

FRAME SAME1 I

PUTSTATIC org/chromium/base/JavaExceptionReporter.$assertionsDisabled : Z

RETURN

会先判断Class.desiredAssertionStatus()的返回值,如果是false, 设置

assertionsDisabled为false。

android中 Class.desiredAssertionStatus() 的定义

public boolean desiredAssertionStatus() {

return false;

}

所以$assertionsDisabled会被设置为true。

真正使用assert的地,会被替换为

L0

LINENUMBER 55 L0

GETSTATIC org/chromium/base/JavaExceptionReporter.$assertionsDisabled : Z

IFNE L1

INVOKESTATIC "assert method"Z

IFNE L1

NEW java/lang/AssertionError

DUP

INVOKESPECIAL java/lang/AssertionError. ()V

ATHROW

L1

LINENUMBER 59 L1

如果$assertionsDisabled 为false,则会先判断assert后面的值,如果是true,则会抛出 AssertionError异常,否则就执行后面的代码。

所以在Android要使assert生效,有两种方法:

adb shell setprop debug.assert 1 (只对dalvik虚拟机生,对art虚拟机不生效!)

使用字节码修改工具,比如asm,用以下代码将赋值$assertionsDisabled的地方替换成POP 指令。

@Override

public void visitFieldInsn(int opcode, String owner, String name, String desc) {

if (opcode == Opcodes.PUTSTATIC && name.equals("$assertionsDisabled")) {

super.visitInsn(Opcodes.POP); // enable assert

}

}

android+读写+assert,Android assert 机制相关推荐

  1. android读写位图,android - 从矢量绘图获取位图

    android - 从矢量绘图获取位图 在我的应用程序中,我必须为通知设置一个大图标.LargeIcon必须是一个Bitmap,我的drawables是矢量图像(Android中的新功能,请看这个链接 ...

  2. android读写文本文件,Android读写文件

    一. 从 resource 中的 raw 文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in = getR ...

  3. Android读写日历,android – 读写日历

    我的目标是阅读和编写日历. 我能够从内容中读取数据:// calendar / calendars和content:// calendar / events String uriString = &q ...

  4. android 单元测试 assert,android单元测试AndroidTestCase

    在实际开发中,开发android软件的过程需要不断的进行测试.而是用Junit测试框架,则是正规android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 第一 ...

  5. 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...

  6. android permission权限与安全机制解析(上)

    目录(?)[-] uses-permission 自定义permission permission标签 permission-tree标签 permission-group标签 安全机制 组件权限 权 ...

  7. epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?

    介绍一下 Android Handler 中的 epoll 机制? 目录: IO 多路复用 select.poll.epoll 对比 epoll API epoll 使用示例 Handler 中的 e ...

  8. 【Android安全】Android SELinux机制 | Android 访问控制模型

    SELinux机制 1. 自主访问控制与强制访问控制 自主访问控制(DAC):Discretionary Access Control 设计理念:客体(例如文件)的所有者,按照自己的安全策略,授予系统 ...

  9. Android全面解析之Context机制

    文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章. 在文章Android全面解析之由浅及深Handler消息机制中讨论到,Handler可以: 避免我们自己去手动写 死循环和输入阻 ...

  10. Android View框架的measure机制

    Android中View框架的工作机制中,主要有三个过程: 1.View树的测量(measure)Android View框架的measure机制 http://www.cnblogs.com/xyh ...

最新文章

  1. asp网上书店系统_Asp.net Core启动流程讲解(一)
  2. [HEOI2017] 相逢是问候
  3. [转]移动应用统一化的谎言:一次编译,到处运行不可能
  4. 迁移到云端,千万别犯这3个大错误!
  5. arm linux内核调试,kgdb在ARM开发板上调试kernel成功
  6. 6000字,详解数据仓库明星产品背后的技术奥秘
  7. 字符串原样输出程序python_Python格式化字符串(格式化输出)
  8. Maven 的相关配置【源码下载、镜像源修改】
  9. Netty初步之hello world
  10. P1334 瑞瑞的木板
  11. mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼
  12. 从零开始山寨Caffe·贰:主存模型
  13. UVA.12230.Crossing Rivers(期望)
  14. 国际结算习题集及答案
  15. 如何在手机端抓https的报文
  16. 增加项目报告功能,支持与TAPD、Jira、禅道双向同步缺陷,MeterSphere开源持续测试平台v1.15.0发布
  17. SketchUp插件|ClothWorks布料模拟 免费下载!(草图大师制作窗帘张拉膜等)
  18. 2020年全国大学生数学建模竞赛优秀论文
  19. pdf文档转word/excel/ppt/图片,pdf加解密,pdf添加水印,pdf拆分合并
  20. “跳出内卷”ROttKRON乐旷陶瓷耳机的新视野,“形、质、声”打开耳机新话题

热门文章

  1. python爬虫如何模仿登录_python爬虫:两种方法模拟登录博客园
  2. 李抗強:類自然數8階完美,類自然數8階富蘭克林
  3. 数据库中Union的用法
  4. full-speed-python 习题解答(二)
  5. 无代码开发平台通讯录导出入门教程
  6. 手把手编写语音矫正(Spelling Corrector) -- 玩具级(python)
  7. 笔记本Ubuntu18.04-盒盖休眠解决办法
  8. Safari访问本地html,safari本地文件读取漏洞之扩展攻击面 | CN-SEC 中文网
  9. 算法竞赛入门经典第二版:循环结构程序设计实例与习题
  10. Linux文本处理sed命令高级用法