gpt4 book ai didi

java - Java 如何处理硬编码数值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:09 27 4
gpt4 key购买 nike

我已经反编译一个包含这一行的 Java 类:

DatabaseError.throwSqlException((int)23);

直到现在,我相信 Java 认为字面值是 int,那么为什么他们强制转换 23 呢? Java 通常如何处理硬编码数值?

编辑:我对这个具体案例不感兴趣,但有兴趣更深入地了解 Java。

最佳答案

我仍然认为它与使用的反编译器有关。

可以假设方法的签名是DatabaseError.throwSqlException(int i) .

声明DatabaseError.throwSqlException((int)23)将被编译为 DatabaseError.throwSqlException(23) - 文字的类型是 int并且方法参数类型是int类型

DatabaseError.throwSqlException((int)23L)将被编译为 DatabaseError.throwSqlException(23) - 该值可以存储在 int 中而不会丢失精度并且方法参数类型是int类型

两种情况都是字节码

bipush 23    // push the value on the operand stack
invokestatic // DatabaseError.throwSqlException:(I)V

反编译为DatabaseError.throwSqlException(23) .因为万一它是 23L在源代码中,此信息不在字节码中。

类似于DatabaseError.throwSqlException((int)23)的字节码可能是

ldc2_w       // push a long from constant pool on the operand stack
l2i // convert top value on the operand stack from long to int
invokestatic // DatabaseError.throwSqlException:(I)V

但是这个被jad反编译了和 jd-guiDatabaseError.throwSqlException((int)23L) (注意值后面的 L)。

编辑 以上字节码由CFR反编译得到作为DatabaseError.throwSqlException((int)23) .所以它真的取决于使用的反编译器。

关于java - Java 如何处理硬编码数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782302/

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