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

标签 java int

我已经反编译一个包含这一行的 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/

相关文章:

Java如何修复 "object is not an instance of declaring class"错误?

java - 原因是什么

将十进制转换为具有长整数值的二进制 C

c - 为什么int的范围有负1?

c - C 中的有符号 vs 无符号 int

java - 将二进制数组转换为 Char Java

java - JUnit交换两个变量的测试方法

java - 使用扫描仪阅读/查找特定部分

java - 小型 Android 开发团队遇到的常见问题有哪些?

groovy - 在 IntRange 上调用 .each{} 返回范围而不是每个整数