我已经反编译一个包含这一行的 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-gui
至 DatabaseError.throwSqlException((int)23L)
(注意值后面的 L
)。
编辑 以上字节码由CFR
反编译得到作为DatabaseError.throwSqlException((int)23)
.所以它真的取决于使用的反编译器。
关于java - Java 如何处理硬编码数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782302/