android+读写+assert,Android assert 机制
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 机制相关推荐
- android读写位图,android - 从矢量绘图获取位图
android - 从矢量绘图获取位图 在我的应用程序中,我必须为通知设置一个大图标.LargeIcon必须是一个Bitmap,我的drawables是矢量图像(Android中的新功能,请看这个链接 ...
- android读写文本文件,Android读写文件
一. 从 resource 中的 raw 文件夹中获取文件并读取数据(资源文件只能读不能写) String res = ""; try{ InputStream in = getR ...
- Android读写日历,android – 读写日历
我的目标是阅读和编写日历. 我能够从内容中读取数据:// calendar / calendars和content:// calendar / events String uriString = &q ...
- android 单元测试 assert,android单元测试AndroidTestCase
在实际开发中,开发android软件的过程需要不断的进行测试.而是用Junit测试框架,则是正规android开发的必用技术,在Junit中可以得到组件,可以模拟发送事件和检测程序处理的正确性. 第一 ...
- 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路
原文地址: http://blog.csdn.net/luoshengyang/article/details/6621566 上一篇文章Android进程间通信(IPC)机制Binder简要介绍和学 ...
- android permission权限与安全机制解析(上)
目录(?)[-] uses-permission 自定义permission permission标签 permission-tree标签 permission-group标签 安全机制 组件权限 权 ...
- epoll监听文件_介绍一下 Android Handler 中的 epoll 机制?
介绍一下 Android Handler 中的 epoll 机制? 目录: IO 多路复用 select.poll.epoll 对比 epoll API epoll 使用示例 Handler 中的 e ...
- 【Android安全】Android SELinux机制 | Android 访问控制模型
SELinux机制 1. 自主访问控制与强制访问控制 自主访问控制(DAC):Discretionary Access Control 设计理念:客体(例如文件)的所有者,按照自己的安全策略,授予系统 ...
- Android全面解析之Context机制
文章已授权『郭霖』公众号发布 前言 很高兴遇见你~ 欢迎阅读我的文章. 在文章Android全面解析之由浅及深Handler消息机制中讨论到,Handler可以: 避免我们自己去手动写 死循环和输入阻 ...
- Android View框架的measure机制
Android中View框架的工作机制中,主要有三个过程: 1.View树的测量(measure)Android View框架的measure机制 http://www.cnblogs.com/xyh ...
最新文章
- asp网上书店系统_Asp.net Core启动流程讲解(一)
- [HEOI2017] 相逢是问候
- [转]移动应用统一化的谎言:一次编译,到处运行不可能
- 迁移到云端,千万别犯这3个大错误!
- arm linux内核调试,kgdb在ARM开发板上调试kernel成功
- 6000字,详解数据仓库明星产品背后的技术奥秘
- 字符串原样输出程序python_Python格式化字符串(格式化输出)
- Maven 的相关配置【源码下载、镜像源修改】
- Netty初步之hello world
- P1334 瑞瑞的木板
- mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼
- 从零开始山寨Caffe·贰:主存模型
- UVA.12230.Crossing Rivers(期望)
- 国际结算习题集及答案
- 如何在手机端抓https的报文
- 增加项目报告功能,支持与TAPD、Jira、禅道双向同步缺陷,MeterSphere开源持续测试平台v1.15.0发布
- SketchUp插件|ClothWorks布料模拟 免费下载!(草图大师制作窗帘张拉膜等)
- 2020年全国大学生数学建模竞赛优秀论文
- pdf文档转word/excel/ppt/图片,pdf加解密,pdf添加水印,pdf拆分合并
- “跳出内卷”ROttKRON乐旷陶瓷耳机的新视野,“形、质、声”打开耳机新话题
热门文章
- python爬虫如何模仿登录_python爬虫:两种方法模拟登录博客园
- 李抗強:類自然數8階完美,類自然數8階富蘭克林
- 数据库中Union的用法
- full-speed-python 习题解答(二)
- 无代码开发平台通讯录导出入门教程
- 手把手编写语音矫正(Spelling Corrector) -- 玩具级(python)
- 笔记本Ubuntu18.04-盒盖休眠解决办法
- Safari访问本地html,safari本地文件读取漏洞之扩展攻击面 | CN-SEC 中文网
- 算法竞赛入门经典第二版:循环结构程序设计实例与习题
- Linux文本处理sed命令高级用法