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