JVM需要实现所有接口方法吗?

4
我正在尝试使用 Groovy 语言,所以我编写了一个简单的 Groovy HelloWorld 程序并进行了编译和运行,一切正常。当我使用 JAD 反编译器查看编译后的代码时,发现我的 HelloWorld 程序实现了 GroovyObject 接口,但并没有实现该接口中的所有方法。这意味着只有 Java 编译器强制我们实现接口中的所有方法,而 JVM 并不需要。我的理解正确吗?
以下是反编译后的 Groovy 代码:
import groovy.lang.GroovyObject;
import groovy.lang.MetaClass;
import org.codehaus.groovy.runtime.callsite.CallSite;

public class Helloworld_1   implements GroovyObject {
  public Helloworld_1()  {
    Helloworld_1 this;
    CallSite[] arrayOfCallSite = $getCallSiteArray();
    MetaClass localMetaClass = $getStaticMetaClass();
    this.metaClass = localMetaClass;  }

  public static void main(String... args){
    CallSite[] arrayOfCallSite =  $getCallSiteArray();
    arrayOfCallSite[0].callStatic(Helloworld_1.class, "Hello World");
  }  
 static {}
}

任何人请帮忙....

我认为如果分成两个问题会更好。 - Will
我把它分成了两个。 - vicky
$getCallSiteArray() 也没有声明。 - Will
我上面发布的代码是反编译代码[我使用了JAD反编译器]。 - vicky
我尝试使用jd-gui反编译,结果类似,有一些未声明的方法被调用。也许Groovy使用代理来添加功能。 - Will
也许你的反编译器有问题? - jocki
1个回答

1
当使用Groovy控制台时,我可以看到GroovyObject的实现。为了显示生成的源代码,我选择ScriptInspect Ast,并选择At end of Phase下的Class Generation。我还可以通过选择Bytecode选项卡来查看生成的字节码。
我相信负责实现GroovyObject方法的源代码位于org.codehaus.groovy.classgen.Verifier中。有一个名为addGroovyObjectInterfaceAndMethods() 的方法。您可以在https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/classgen/Verifier.java#L310中找到源代码。

谢谢你的回答。我在Groovy控制台中看到了AST转换,但是AST转换发生在编译时,那么我们编译后的代码如何在JVM上运行呢? - vicky
1
在编译源代码时,Groovy使用ASM库来生成方法(包括GroovyObject的实现)。生成的类应该是一个有效的JVM类。我以前没有使用过JAD。尝试使用JDK中的javap工具,例如javap -p -c MyClass,您将看到接口中的所有方法都存在。 - jocki
哦,太好了。谢谢你的帮助。 - vicky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接