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. 1.2 C语言--函数与数组
  2. 衡阳a货翡翠,南平a货翡翠
  3. 【算法设计与分析】Dijskra算法代码:Java版
  4. Windows Phone开发(16):样式和控件模板 转:http://blog.csdn.net/tcjiaan/article/details/7367260...
  5. 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
  6. JavaScript-关于变量
  7. resiprocate 之repro注册
  8. 的级联选择_OpenCV-Python 级联分类器 | 六十二
  9. 面试官问现在工资是多少,该怎么回答?
  10. SQL解析处理和扩展开发工具 Java
  11. Redis中的lua脚本
  12. css扫描动画效果demo示例(整理)
  13. 港科百创 | 一清创新完成Pre-A+轮战略融资
  14. 32位MD5加密 可用来微信加密
  15. 人工智能研究中心快递柜——代码分析七
  16. 欧姆龙气压传感器 2SMPB-02E程序编写
  17. 07.26爬虫request模块之药监局学习笔记
  18. FastICA算法类有哪些最新发表的毕业论文呢?
  19. TCP快速连接(tfo,TCP fastopen)
  20. 值得关注技术网站汇总,以及技术(自学用)

热门文章

  1. java se基础1
  2. flutter集成百度离线人脸识别
  3. npm 报错ERR Host key verification failed.
  4. 05SG343 现浇混凝土空心楼盖 免费下载
  5. 206658-92-6,Tacrine hydrochloride hydrate,盐酸他克林水合物是一种活性胆碱酯酶抑制剂
  6. [v9] phpcms v9手机门户配置方法
  7. Android 调用前置摄像头
  8. C# 中 MessageBox的使用详解
  9. lighthouse脚本
  10. maya对象属性_maya添加属性,MAYA