groovyc在我返回字节码后添加语句

groovyc在我返回字节码后添加语句,groovy,bytecode,Groovy,Bytecode,一个简单的实验,其中一个方法添加两个整数 Java中的第一个: gravadlax@durum byte_me> cat Add.java public class Add { public int add(int i, int j) { return i + j; } } 这不会导致字节码中出现任何意外情况(删除了不相关的部分): 现在在Groovy中,使用@CompileStatic: gravadlax@durum byte_me> cat A

一个简单的实验,其中一个方法添加两个整数

Java中的第一个:

gravadlax@durum byte_me> cat Add.java
public class Add {
    public int add(int i, int j) {
        return i + j;
    }
}
这不会导致字节码中出现任何意外情况(删除了不相关的部分):

现在在Groovy中,使用
@CompileStatic

gravadlax@durum byte_me> cat Add.groovy
@groovy.transform.CompileStatic
class Add {
    int add(int i, int j) {
        i + j
    }
}
字节码:

gravadlax@durum byte_me> groovyc Add.groovy && javap -c Add

  public int add(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: ireturn
       4: ldc           #34                 // int 0
       6: ireturn
这太奇怪了。4号和6号在这里干什么?并不是说它在实践中会改变任何东西,而是出于好奇,为什么会生成这两个额外的语句

Groovy版本:2.3.4 JVM:1.7.0\u 60供应商:Oracle公司操作系统:Mac OS X Java(TM)SE运行时环境(build 1.7.0_60-b19)
Java HotSpot(TM)64位服务器虚拟机(构建24.60-b09,混合模式)

groovy的哪个版本?可能是隐式返回,如果
返回i+j
,会得到不同的结果吗?@tim_-yates编辑,我知道我忘记了什么。它不是
返回
;事实上,我一开始就认为这可能是问题的原因,于是我把它去掉了。没什么区别。尾随的
也一样:没有影响。这可能只是grooyc实现方式的一个怪癖。我建议您查看Groovy源代码,看看是否可以找到这个问题。
gravadlax@durum byte_me> groovyc Add.groovy && javap -c Add

  public int add(int, int);
    Code:
       0: iload_1
       1: iload_2
       2: iadd
       3: ireturn
       4: ldc           #34                 // int 0
       6: ireturn