Java 方法应返回boolean,返回int

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; } 您

我必须创建一个类似于罐子里的方法。我没有密码,所以我不允许学习。 我使用的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;
}
您可以在方法签名中看到,它应该返回一个
布尔值
,但它实际上返回一个
ì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        <------------
}