我有反编译包含以下行的Java类:
DatabaseError.throwSqlException((int)23);
到目前为止,我认为Java认为字面数值是int
,那么为什么他们会投射23
?一般来说Java如何处理硬编码数值?
编辑:我对这个具体案例不感兴趣,但有兴趣深入了解Java。
答案 0 :(得分:2)
我仍然认为它与使用过的反编译器有关。
可以假设方法的签名是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)
。所以它真的取决于使用的反编译器。
答案 1 :(得分:0)
根据Oracle Java Tutorials Primitive Data Types:
如果整数文字以字母L或l结尾,则其长度为long;否则它是int类型。
至于特定的反编译声明:
DatabaseError.throwSqlException((int)23);
只有编写声明的人才能回答。也许他不确定23是一个字节还是一个整数。