Java如何处理硬编码的数值?

Java如何处理硬编码的数值?,java,int,Java,Int,我已经反编译了一个Java类,其中包含以下内容: DatabaseError.throwSqlException((int)23); 直到现在我认为java认为文字数值是 int >代码>,为什么他们要写 23 ?Java通常如何处理硬编码的数值 编辑:我对这个具体的案例不感兴趣,但对Java的深入研究很感兴趣。根据: 如果整型文字以字母L或L结尾,则其类型为long;否则它是int类型 对于特定的反编译语句: DatabaseError.throwSqlException((int)23);

我已经反编译了一个Java类,其中包含以下内容:

DatabaseError.throwSqlException((int)23);
直到现在我认为java认为文字数值是<代码> int >代码>,为什么他们要写<代码> 23 <代码>?Java通常如何处理硬编码的数值

编辑:我对这个具体的案例不感兴趣,但对Java的深入研究很感兴趣。

根据:

如果整型文字以字母L或L结尾,则其类型为long;否则它是int类型

对于特定的反编译语句:

DatabaseError.throwSqlException((int)23);

只有编写声明的人才能肯定地回答。也许他不确定23是字节还是整数。

我仍然相信它与使用的反编译器有关

可以假设该方法的签名是
DatabaseError.throwSqlException(inti)

语句
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
反编译后会出现
数据库错误。throwSqlException(23)
。因为如果它是源代码中的
23L
,那么这个信息就不会出现在字节码中

类似于
数据库错误的字节码。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
jdgui
反编译到
DatabaseError.throwSqlException((int)23L)
(注意值后面的
L


edit上述字节码由
CFR
反编译为
DatabaseError.throwSqlException((int)23)
。因此,这实际上取决于所使用的反编译器。

这是反编译过程的结果还是源文件包含的内容?硬编码的数字表示
int
double
,如果它写为
.0
0.0
。你可能会被反编译器愚弄,但无论如何,不必要的int强制转换这是一个副本吗?OP询问反编译器为何发出强制转换;dupe在问为什么太大的整数会导致编译器错误。@Colonelthirtytwon不,OP在问“Java通常如何处理硬编码的数值?”这一点在那边和其他帖子中都有回答。整数文本是一个
int
,这就是它的全部内容。谢谢你,你提供了这么多信息,它是@54l3d谢谢。因此,这实际上取决于使用的反编译器。