前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kotlin编译与Intrinsics检查

Kotlin编译与Intrinsics检查

作者头像
技术小黑屋
发布于 2020-01-21 06:47:49
发布于 2020-01-21 06:47:49
1.6K0
举报
文章被收录于专栏:技术小黑屋技术小黑屋

在很早的时候,小黑屋就介绍过如何研究Kotlin,其中涉及到了查看字节码和反编译成Java代码的方式,相信很多人研究过的人,都会或多或少遇到过Intrinsics.checkParameterIsNotNull这样或者类似的代码。

首先,我们先看一下这段简单的方法

1 2 3

fun dumpStringMessage(message: String) { println("dumpStringMessage=$message") }

按照我们之前的方法,反编译成Java代码就是这样的

1 2 3 4 5 6

public static final void dumpStringMessage(@NotNull String message) { Intrinsics.checkParameterIsNotNull(message, "message"); String var1 = "dumpStringMessage=" + message; boolean var2 = false; System.out.println(var1); }

反编译后,我们可以看到代码中有这样的一行代码Intrinsics.checkParameterIsNotNull(message, "message");

Intrinsics 是什么

  • Intrinsics是Kotlin内部的一个类
  • 包含了检查参数是否为null的checkParameterIsNotNull
  • 包含了表达式结果是否为null的checkExpressionValueIsNotNull
  • 包含了检测lateinit是否初始化的throwUninitializedPropertyAccessException
  • 包含了开发者强制非空!!出现空指针时抛出throwNpe的方法
  • 判断对象相等的方法areEqual
  • 其他的一些处理数据异常的方法和辅助方法

所以上面代码中的Intrinsics.checkParameterIsNotNull(message, "message");是为了检测参数message是否为null进行的判断。

为什么会有Intrinsics等判断代码呢

不是说 Kotlin 是空指针安全,有可空(Any?)和不可空(Any)的类型么,我上面的代码声明的是message: String又不是message: String?,为什么还要多此一举呢?

是的,你的这句话基本上没有毛病,但是有一个前提,那就是空指针和两种类型的特性,目前只在纯kotlin中生效,一旦涉及到和Java交互时,就不灵了。

比如我们在Java代码中这样调用,不会产生任何编译的问题。

1 2 3 4 5

public class JavaTest { public void test() { StringExtKt.dumpStringMessage(null); } }

但是当我们运行时,就会报出这样的错误

1 2 3 4 5 6 7

Exception in thread "main" java.lang.IllegalArgumentException: Parameter specified as non-null is null: method StringExtKt.dumpStringMessage, parameter message at StringExtKt.dumpStringMessage(StringExt.kt) at JavaTest.test(JavaTest.java:5) at MainKt.main(Main.kt:3) at MainKt.main(Main.kt) Process finished with exit code 1

所以考虑到方法被Java调用的情况,Kotlin会默认的增加checkParameterIsNotNull校验。

Intrinsics.checkParameterIsNotNull 一直都有么?

不过好在Kotlin编译器还是足够聪明的,对于不能被Java直接调用的方法,就不会增加相关处理。

比如标记为private的方法,通常情况下,不会被java调用。

1 2 3

private fun innerDumpStringMessage(message: String) { println("innerDumpStringMessage=$message") }

反编译成的如下代码,就没有Intrinsics.checkParameterIsNotNull

1 2 3 4 5

private static final void innerDumpStringMessage(String message) { String var1 = "innerDumpStringMessage=" + message; boolean var2 = false; System.out.println(var1); }

Intrinsics.checkParameterIsNotNull 的好处

定位排查问题快捷

上面代码的好处之一就是对于代码混淆之后,可以相对更加方便的定位问题。

比如这段代码,经过混淆之后,运行

1 2 3 4 5

public class JavaMethod { public void callKotlin() { KotlinCodeKt.dumpMessage(null); } }

得到如下的崩溃日志

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.droidyue.intrinsicsmattersandroidsample/com.droidyue.intrinsicsmattersandroidsample.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method a.a.a.a.a, parameter message E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927) E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) E AndroidRuntime: at android.app.ActivityThread.-wrap14(ActivityThread.java) E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) E AndroidRuntime: at android.os.Looper.loop(Looper.java:154) E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6682) E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method a.a.a.a.a, parameter message E AndroidRuntime: at com.droidyue.intrinsicsmattersandroidsample.b.a(Unknown Source) E AndroidRuntime: at com.droidyue.intrinsicsmattersandroidsample.a.a(Unknown Source) E AndroidRuntime: at com.droidyue.intrinsicsmattersandroidsample.MainActivity.onCreate(Unknown Source) E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:6942) E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126) E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880) E AndroidRuntime: ... 9 more

这里我们可以清晰的看到出问题的参数名称,定位出问题的位置。

其他好处

  • 对于先决条件(参数和状态)提前判断可以避免很多不必要的资源消耗。
  • 避免不必要的状态产生

Intrinsics的问题

刚才我们提到了Intrinsics可以辅助混淆情况下定位排查问题,但是同时也带来了一个问题,那就是

  • 为混淆之后逆向工程提供了更多的帮助。

除此之外,还有人担心Intrinsics是不是存在这样的问题

  • Intrinsics调用和返回带来进栈出栈操作,而Intrinsics为java实现,无法在编译时inline,会不会有性能问题

对于性能的担忧可以说是有些过于杞人忧天了,不过还在好在Kotlin提供了方法来消除这种不必要的过虑。当然也能解决逆向混淆的问题。

编译时去除Intrinsics检查

1 2

-Xno-param-assertions Don't generate not-null assertions on parameters of methods accessible from Java -Xno-receiver-assertions Don't generate not-null assertion for extension receiver arguments of platform types

具体的实施方法,可以参考另一篇文章为 Kotlin 项目设置编译选项

其他Intrinsics出现的场景

checkExpressionValueIsNotNull

当Kotlin 调用 Java 获取表达式结果后需要进行操作时,会增加Intrinsics.checkExpressionValueIsNotNull校验

1 2 3 4 5

//Intrinsics.checkExpressionValueIsNotNull(var10000, "JavaUtil.getBook()"); fun test1() { val book: Book = JavaUtil.getBook() book.name }

Intrinsics.throwNpe

当使用!!非空断言时,会有校验非空断言结果的检查,如果有问题,则抛出NPE.

1 2 3 4 5 6 7 8

/** * if (message == null) { Intrinsics.throwNpe(); } */ fun test2(message: String?) { message!!.toInt() }

throwUninitializedPropertyAccessException

当尝试访问一个lateinit的属性时,会增加是否初始化的判断,如果有问题,会抛出异常。

1 2 3 4 5 6 7

class Movie { lateinit var name: String //Intrinsics.throwUninitializedPropertyAccessException("name"); fun dump() { println(name) } }

以上就是关于Kotlin编译与 Intrinsics 检查的内容。Enjoy.

相关文章推荐阅读

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
AI教育大模型及其应用
人工智能在教育领域的应用日益深入,涌现出许多AI教育大模型,它们致力于提升教学效率、优化学习体验、推动教育公平。这些大模型通常以通用大模型为基础,通过针对教育场景的持续训练和优化,不断提高解决教育专业任务的能力。
数字孪生开发者
2025/06/19
290
AI教育大模型及其应用
学而思研发面向全球数学爱好者大模型MathGPT
---- 新智元报道   编辑:好困 【新智元导读】近日,学而思官宣称,正在自研的数学大模型「MathGPT」,目前已取得阶段性成果。 近日,在各家大厂打得如火如荼的「ChatGPT大战」中,学而思也加入其中。 不过,学而思另辟蹊径选择的是自研数学大模型「MathGPT」,以数学领域的解题和讲题算法为核心,并且已经取得了阶段性成果。 对此学而思表示,基于该自研大模型的产品级应用预计会在年内推出,将面向全球数学爱好者和科研机构。 作为公司的核心项目,学而思早在今年春节之前就启动了相应的团队建设、数据、
新智元
2023/05/09
2670
学而思研发面向全球数学爱好者大模型MathGPT
千亿级、数学专用,MathGPT大模型开始公测了
8 月 24 日,机器之心获悉,在好未来 20 周年直播活动中,CTO 田密宣布好未来自研的数学领域千亿级大模型 MathGPT 开启内测。即日起,用户可通过官网(www.mathgpt.com)申请注册账号免费试用体验。
机器之心
2023/09/08
5310
千亿级、数学专用,MathGPT大模型开始公测了
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
机器之心原创 作者:蛋酱 数学大模型 MathGPT,专治大语言模型的「偏科」问题。 不做通用 LLM,不基于现有 LLM 做微调和接口调用,学而思自研的数学大模型 MathGPT 要来了。 这对于全世界的数学爱好者来说,都是个值得关注的好消息。 MathGPT 是面向全球数学爱好者和科研机构,以数学领域的解题和讲题算法为核心的大模型。据了解,学而思已将 MathGPT 定位为公司核心项目,由 CTO 田密负责,今年春节前,研发正在进行中,该项目已经启动相应的团队建设、数据、算力准备和技术研发。 进度方面
机器之心
2023/05/09
6970
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
实测学而思MathGPT大模型:中小学数学解题正确率有望在全球范围内创造新 SOTA
这着实是数理爱好者福音了!要知道市面上GPT-4在内的通用大模型,都无法实现这一点。
量子位
2023/09/08
6710
实测学而思MathGPT大模型:中小学数学解题正确率有望在全球范围内创造新 SOTA
学习机火拼大模型:科大讯飞、学而思、网易有道赌上半条身家性命
过去几年,“双减”落地教培落幕,学习机因其资源整合和效率提升的优势,成为越来越多家长减轻教育焦虑的不二选择。
刘旷
2024/06/11
1800
prompt概念提出者之一刘鹏飞发布Abel,仅仅使用SFT即可达数学开源SoTA,超越十亿多美元模型MathGPT和GPT4
今天突然看到prompt概念提出者刘鹏飞(现上交大副教授)在twitter上的消息:
zenRRan
2023/09/25
6010
prompt概念提出者之一刘鹏飞发布Abel,仅仅使用SFT即可达数学开源SoTA,超越十亿多美元模型MathGPT和GPT4
万“模”霜天竞自由!开源大模型的春天来了?
在当代人工智能领域中,如果将算力比作是AI的燃料,那么大模型则相当于AI的发动机。算力充当着AI体系运作的根基,使得复杂的算法和模型得以运行,大模型则将这些算力转换为具体的智能输出。而开源大模型则是人人都能用得上的发动机。
数据猿
2024/04/30
2390
万“模”霜天竞自由!开源大模型的春天来了?
清北爸爸辅导数学崩溃瞬间,这个国产大模型有解!AI启发问答关键情绪稳定
让清北毕业的爸爸都崩溃的这个难题,恐怕没有这么简单。毕竟,自己会做一道题和能把孩子教会,是完全不同的两件事。
新智元
2024/06/17
1550
清北爸爸辅导数学崩溃瞬间,这个国产大模型有解!AI启发问答关键情绪稳定
垂直大模型竞争,能突破数据“卡点”吗?
随着各大厂商参与竞逐,市场正在分化为通用与垂直两大路径,两者在参数级别、应用场景、商业模式等方面差异已逐步显现。
科技云报道
2023/08/03
4900
垂直大模型竞争,能突破数据“卡点”吗?
李航:关于大模型的思考及研究热点
ChatGPT 和 GPT4,相比传统的深度学习技术,如 BERT,主要是在智能性和通用性上取得了巨大突破。具备语言、知识、简单推理能力,能够很好地近似人的智能行为。不需要标注数据就可以在不同领域完成不同任务,也就是进行零样本或小样本学习。
算法进阶
2023/10/23
3970
李航:关于大模型的思考及研究热点
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?
去年 2 月份,DeepMind 发布了编程辅助利器 AlphaCode。它使用人工智能技术来帮助程序员更快地编写代码,可以自动完成代码、提供代码建议并检查错误,从而提高编程效率。AlphaCode 的问世意味着 AI 在解决现实世界问题的道路上又迈出了一大步。
机器之心
2023/08/07
4410
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?
MLLM真能看懂数学吗?MathVerse来了次摸底测评,放出当天登热榜
AIxiv专栏是机器之心发布学术、技术内容的栏目。过去数年,机器之心AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,欢迎投稿或者联系报道。投稿邮箱:liyazhou@jiqizhixin.com;zhaoyunfeng@jiqizhixin.com。
机器之心
2024/04/19
1810
MLLM真能看懂数学吗?MathVerse来了次摸底测评,放出当天登热榜
白话科普:如何训练ChatGPT,能用它来挣钱吗?【P.S. 今晚19:30,说透ChatGPT】
本文作者 | 张杰   责编 | Carol 出品 | AI科技大本营(ID:rgznai100) 对话机器人不是个新技术,以往的机器人产品很多,为什么这次OpenAI公司推出的ChatGPT能这么火?因为以前的机器人只能做简单且有限的事,问天气、放音乐还行,问个复杂一些的事就有点“人工智障”了。ChatGPT可以说技术上的量变引起了效果上的质变,在三个方面让我感觉很惊艳: 有上下文记忆能力,多轮对话衔接得很好,很难看出是机器生成的; 有学习纠错能力,在它回答错误之后,如果你纠正了它,第二次就不会再答错;
AI科技大本营
2023/04/06
4890
白话科普:如何训练ChatGPT,能用它来挣钱吗?【P.S. 今晚19:30,说透ChatGPT】
谷歌研究员炮轰GPT初创公司瞎炒作,连发18条推文怒怼!
---- 新智元报道   编辑:昕朋 【新智元导读】面对GPT公司疯狂营销的乱象,谷歌研究员发长文怒怼其商业化模式:炒作救不了GPT!但投资人表示:无所谓,好玩就行 在AI领域,去年的流量王者,非生成式AI莫属。 从DALL-E 2到ChatGPT,从Stable Diffusion到Midjourney,AIGC行业呈现爆炸式的增长。 基于人工智能的生成式工具纷至沓来,让投资公司和广大公众眼花缭乱。 顶级投资公司红杉资本在一篇博文中写道:「生成式人工智能不仅变得更快、更便宜,而且在某些情况下比人类创
新智元
2023/02/24
3100
谷歌研究员炮轰GPT初创公司瞎炒作,连发18条推文怒怼!
人美声甜GPT,数学题哪里不会讲哪里
衡宇 发自 凹非寺 量子位 | 公众号 QbitAI 大模型的颠覆和变革,还只是开始。 ChatGPT一炮而红,重塑搜索、办公协同等多个场景和行业后,在线教育,被视为最重要的垂直场景——毕竟大语言模型展示出的能力,正是之前在线教育、AI老师所亟需的。 而且这种趋势已经开始,背靠大模型相关的在线教育应用,已经率先在海外火爆。 看过来!让GPT化身二次元美少女AI家教来讲数学题的方案,每步都有解法,再不用担心看见参考答案的“略”字: 基础到某个三角函数的定义,复杂到不同的解题方法与技巧,都能得到答案: 这就
量子位
2023/05/06
5170
人美声甜GPT,数学题哪里不会讲哪里
从逆境转型重生的科大讯飞半年报:AI大模型的无限机遇
8月12日,A股上市公司科大讯飞披露2023年上半年财报,由于收入下降和成本增长,公司净利润出现大幅下滑,盈利状况不尽如人意。
数据猿
2023/09/15
3480
从逆境转型重生的科大讯飞半年报:AI大模型的无限机遇
LLM评估综述论文问世,分三方面全面总结,还带资料库
大型语言模型(LLM)已经得到了学术界和产业界的广泛关注,而为了开发出好用的 LLM,适当的评估方法必不可少。现在,一篇有关 LLM 评估的综述论文终于来了!其中分三方面对 LLM 评估的相关研究工作进行了全面的总结,可帮助相关研究者索引和参考。
机器之心
2023/08/08
4390
LLM评估综述论文问世,分三方面全面总结,还带资料库
图灵巨头现身ICLR,顶会现场疯狂追星LeCun、Bengio!中国团队三大技术趋势引爆AGI新想象
图灵三巨头中的著名「e人」LeCun,提前就在X上大方公布出自己的行程,满怀期待地等着和粉丝们相见了。
新智元
2024/05/14
1340
图灵巨头现身ICLR,顶会现场疯狂追星LeCun、Bengio!中国团队三大技术趋势引爆AGI新想象
4个月狂揽两千万,国内首个披露营收的大模型来了!
8月31日,10余家大模型陆续通过《生成式人工智能服务管理暂行办法》备案,最终获批向公众开放。360智脑也已首批完成备案提交,预计将在未来1周左右陆续由各地方管理部门对外披露。
新智元
2023/09/09
3280
4个月狂揽两千万,国内首个披露营收的大模型来了!
推荐阅读
AI教育大模型及其应用
290
学而思研发面向全球数学爱好者大模型MathGPT
2670
千亿级、数学专用,MathGPT大模型开始公测了
5310
解决通用LLM「偏科」问题,数学大模型MathGPT要来了!
6970
实测学而思MathGPT大模型:中小学数学解题正确率有望在全球范围内创造新 SOTA
6710
学习机火拼大模型:科大讯飞、学而思、网易有道赌上半条身家性命
1800
prompt概念提出者之一刘鹏飞发布Abel,仅仅使用SFT即可达数学开源SoTA,超越十亿多美元模型MathGPT和GPT4
6010
万“模”霜天竞自由!开源大模型的春天来了?
2390
清北爸爸辅导数学崩溃瞬间,这个国产大模型有解!AI启发问答关键情绪稳定
1550
垂直大模型竞争,能突破数据“卡点”吗?
4900
李航:关于大模型的思考及研究热点
3970
大模型帮陶哲轩解题、证明数学定理:数学真要成为首个借助AI实现突破的学科了?
4410
MLLM真能看懂数学吗?MathVerse来了次摸底测评,放出当天登热榜
1810
白话科普:如何训练ChatGPT,能用它来挣钱吗?【P.S. 今晚19:30,说透ChatGPT】
4890
谷歌研究员炮轰GPT初创公司瞎炒作,连发18条推文怒怼!
3100
人美声甜GPT,数学题哪里不会讲哪里
5170
从逆境转型重生的科大讯飞半年报:AI大模型的无限机遇
3480
LLM评估综述论文问世,分三方面全面总结,还带资料库
4390
图灵巨头现身ICLR,顶会现场疯狂追星LeCun、Bengio!中国团队三大技术趋势引爆AGI新想象
1340
4个月狂揽两千万,国内首个披露营收的大模型来了!
3280
相关推荐
AI教育大模型及其应用
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • Intrinsics 是什么
  • 为什么会有Intrinsics等判断代码呢
  • Intrinsics.checkParameterIsNotNull 一直都有么?
  • Intrinsics.checkParameterIsNotNull 的好处
    • 定位排查问题快捷
  • 其他好处
  • Intrinsics的问题
  • 编译时去除Intrinsics检查
  • 其他Intrinsics出现的场景
    • checkExpressionValueIsNotNull
    • Intrinsics.throwNpe
    • throwUninitializedPropertyAccessException
  • 相关文章推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档