Java如何处理硬编码数值?

时间:2015-11-18 14:12:10

标签: java int

我有反编译包含以下行的Java类:

DatabaseError.throwSqlException((int)23);

到目前为止,我认为Java认为字面数值是int,那么为什么他们会投射23?一般来说Java如何处理硬编码数值?

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

2 个答案:

答案 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

但这会被jadjd-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是一个字节还是一个整数。