Java 方法应返回boolean,返回int
我必须创建一个类似于罐子里的方法。我没有密码,所以我不允许学习。 我使用的JD-GUI告诉我:Java 方法应返回boolean,返回int,java,methods,bytecode,Java,Methods,Bytecode,我必须创建一个类似于罐子里的方法。我没有密码,所以我不允许学习。 我使用的JD-GUI告诉我: private static boolean checkMe(Date paramDate, String paramString) throws REUException { int i = 1; int j, k; // unrelated stuff if (j > k) i = 0; return i; } 您
private static boolean checkMe(Date paramDate, String paramString)
throws REUException {
int i = 1;
int j, k;
// unrelated stuff
if (j > k)
i = 0;
return i;
}
您可以在方法签名中看到,它应该返回一个布尔值
,但它实际上返回一个ìnt
,这在Java中是不允许的所以,我认为JD-GUI有问题 我试着用
javap
解压,但还是没有得到任何线索:
使用:javap-c-s-verbose-private类
我得到:
private static boolean checkMe(java.util.Date, java.lang.String) throws reu.exceptions.REUException;
Signature: (Ljava/util/Date;Ljava/lang/String;)Z
Code:
Stack=4, Locals=7, Args_size=2
0: iconst_1
1: istore_2
2: getstatic #34; //Field iniciado:Z
5: ifne 44
8: ldc_w #35; //class reu/modulos/STDWDATES
11: dup
12: astore_3
13: monitorenter
14: getstatic #34; //Field iniciado:Z
17: ifne 32
20: new #35; //class reu/modulos/STDWDATES
23: dup
24: invokespecial #36; //Method "<init>":()V
27: pop
28: iconst_1
29: putstatic #34; //Field iniciado:Z
32: aload_3
33: monitorexit
34: goto 44
37: astore 4
39: aload_3
40: monitorexit
41: aload 4
43: athrow
44: aconst_null
45: getstatic #37; //Field AlmacenFechaCal:Ljava/util/HashMap;
48: aload_1
49: invokevirtual #38; //Method java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
52: if_acmpne 67
55: new #39; //class reu/exceptions/REUException
58: dup
59: bipush 58
61: bipush 17
63: invokespecial #40; //Method reu/exceptions/REUException."<init>":(II)V
66: athrow
67: getstatic #37; //Field AlmacenFechaCal:Ljava/util/HashMap;
70: aload_1
71: invokevirtual #38; //Method java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
74: checkcast #41; //class reu/modulos/AlmancenFechas
77: astore_3
78: aload_3
79: invokevirtual #42; //Method reu/modulos/AlmancenFechas.getFechaIni:()I
82: istore 4
84: invokestatic #43; //Method java/util/Calendar.getInstance:()Ljava/util/Calendar;
87: astore 5
89: aload 5
91: aload_0
92: invokevirtual #44; //Method java/util/Calendar.setTime:(Ljava/util/Date;)V
95: aload 5
97: iconst_1
98: invokevirtual #45; //Method java/util/Calendar.get:(I)I
101: istore 6
103: iload 4
105: iload 6
107: if_icmple 112
110: iconst_0
111: istore_2
112: iload_2
113: ireturn
Exception table:
from to target type
14 34 37 any
37 41 37 any
Exceptions:
throws reu.exceptions.REUException
private static boolean checkMe(java.util.Date,java.lang.String)抛出reu.exceptions.REUException;
签名:(Ljava/util/Date;Ljava/lang/String;)Z
代码:
堆栈=4,局部变量=7,参数大小=2
0:iconst_1
1:istore_2
2:getstatic#34//字段iniciado:Z
5:ifne 44
8:ldc#U w#35//类reu/模/STDWDATES
11:dup
12:astore_3
13:监视器中心
14:getstatic#34//字段iniciado:Z
17:ifne 32
20:新#35//类reu/模/STDWDATES
23:dup
24分:特别是36分//方法“”:()V
27:流行音乐
28:iconst_1
29:putstatic#34//字段iniciado:Z
32:aload_3
33:监测退出
34:goto 44
37:astore 4
39:aload_3
40:monitorexit
41:aload 4
43:athrow
44:aconst_null
45:getstatic#37//字段AlmacenFechaCal:Ljava/util/HashMap;
48:aload_1
49:invokevirtual#38//方法java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
52:if_acmpne 67
55:新#39//类reu/异常/reu异常
58:dup
59:58
61:bipush 17
63分:特别是40分//方法reu/exceptions/REUException.“:(II)V
66:athrow
67:getstatic#37//字段AlmacenFechaCal:Ljava/util/HashMap;
70:aload_1
71:invokevirtual#38//方法java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;
74:checkcast#41//类reu/模/AlmancenFechas
77:astore_3
78:aload_3
79:invokevirtual#42//方法reu/modulos/AlmancenFechas.getFechaIni:()I
82:istore 4
84:invokestatic#43//方法java/util/Calendar.getInstance:()Ljava/util/Calendar;
87:astore 5
89:aload 5
91:aload_0
92:invokevirtual#44//方法java/util/Calendar.setTime:(Ljava/util/Date;)V
95:aload 5
97:iconst_1
98:invokevirtual#45//方法java/util/Calendar.get:(I)I
101:istore 6
103:iload 4
105:iload 6
107:if_icmple 112
110:iconst_0
111:istore_2
112:iload_2
113:我轮到你了
例外情况表:
从到目标类型
14 34 37任何
37 41 37任何
例外情况:
抛出reu.exceptions.REUException
我猜线索是113中的表达。根据,它返回一个int
在这种情况下,看起来不允许从int转换为boolean,这与C/C++不同
这怎么可能?有隐性演员吗
谢谢 JVM将boolean
s表示为int
s:true
表示为1
,false
表示为0
。这就是编译代码使用整数的原因
换句话说,如果您编写该方法并使用boolean
s,如下所示(可能是原始源代码):
然后生成的字节码将在末尾包含ireturn
。JVM使用整数表示布尔值。从:
2.3.4。布尔类型
尽管Java虚拟机定义了一个布尔类型,但它只提供了非常有限的支持。没有专门用于布尔值操作的Java虚拟机指令。相反,Java编程语言中对布尔值进行操作的表达式被编译为使用Java虚拟机int数据类型的值
你可以自己检查一下:
$ cat Test.java
class Test {
boolean m() {
return true; <------------
}
}
$ javac Test.java
$ javap -c Test
Compiled from "Test.java"
class Test {
[...]
boolean m();
Code:
0: iconst_1
1: ireturn <------------
}
$cat Test.java
课堂测试{
布尔m(){
return true;不为我编译。这应该是你的编译器的问题。它不应该编译。大多数缩小的转换都会在java中产生编译时错误。请参阅此答案以获得解释和示例@TheLostMind,我知道它不编译。这就是为什么我会提出这个问题。我正在展示从JAR中的类反编译的代码。@Mints97,你的答案也是一样:)OP发现了一个类,并使用反编译器来获取Java代码。原始Java代码很可能是有效的(使用布尔值而不是整数)。@aioobe。我理解,这意味着JD-GUI有某种缺陷。然而,这很奇怪,因为我用JD-GUI(使用变量)反编译了你的示例,它显示:boolean m(){boolean bool=false;返回bool;}
,这是正确的。这很有趣。我同意,既然它正确地获得了方法的返回类型,它肯定应该足够聪明,能够发现I
最初是一个boolean
。是的。现在这只是好奇。如果我能够找到它们,我会尝试将这个可能的“错误”告知project或者使用另一个反编译器。谢谢。对。这是一个好习惯,作为一个程序员,这是友好的行为:-)谢谢。不幸的是,我没有获得源代码。我已经试过你说的:编译你提供的代码,然后反编译,它显示I
为boolean
,而不是int
。这是我不理解的nd,这就是我问的原因。那么这可能是JD-GUI反编译器本身的一个bug。是的。我想没有其他选择。我会尝试向他们报告。谢谢。
$ cat Test.java
class Test {
boolean m() {
return true; <------------
}
}
$ javac Test.java
$ javap -c Test
Compiled from "Test.java"
class Test {
[...]
boolean m();
Code:
0: iconst_1
1: ireturn <------------
}