gpt4 book ai didi

java - Java字节码中的`obj.f(null)`

转载 作者:行者123 更新时间:2023-12-02 05:00:55 24 4
gpt4 key购买 nike

是否可以安全地假设 obj.f(null) 始终编译为 2 个连续指令

ACONST_NULL
INVOKEVIRTUAL <type-of-obj> f <descriptor-of-f>

通过javac,无论obj.f(null)出现在源代码中的什么位置以及它如何与其他源代码混合?

编辑:我不打算进行可空性检查。我不关心 Object a = null; obj.f(a);.

<小时/>

编辑:@OliverCharlesworth 问了我原来的问题。我想使用 asm 库检测字节码中的 obj.f(null) 。人们很容易想到解决这个问题的两种方法。

  1. 当感兴趣的INVOKEVIRTUAL被调用时,使用AnalyzerAdapter来验证堆栈中的最后一个元素是否为NULL类型。这当然有效,但涉及扩展堆栈帧,并且成本更高。

  2. 检测ACONST_NULL,然后检测INVOKEVIRTUAL。它可能有效。但我不确定。因此,我在这里问这个问题。

最佳答案

假设 obj.f 是一个非静态、非接口(interface)、非父类(super class)、非私有(private)方法、非内部/外部类方法(编辑:而且也是非可变参数),那么是的,我认为它在实践中可以安全地假设。当然,javac明天总是可以改变的,但是很难想象改变这一点,因为它是编译相应代码的最简单、最自然的方式。

请注意,如果上面列出的任何条件为真,则可能会进行不同的编译。例如,静态方法显然会使用 invokestatic 而不是 invokevirtual。如果从内部类在外部类上调用该方法,它可能会调用编译器生成的合成方法,依此类推。

关于java - Java字节码中的`obj.f(null)`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com