Java JVM不需要实现所有的接口方法吗?
我正在尝试groovy,所以我在groovy中编写了一个示例HelloWorld程序,并对其进行了编译&运行,效果很好,当我看到使用JAD反编译器编译的代码时,我的HelloWorld程序实现了GroovyObject接口,但它没有实现该接口中的所有方法,所以这意味着只有java编译器强制我们实现接口中的所有方法,但JVM不需要。我说得对吗 这是反编译的groovy代码:Java JVM不需要实现所有的接口方法吗?,java,grails,groovy,Java,Grails,Groovy,我正在尝试groovy,所以我在groovy中编写了一个示例HelloWorld程序,并对其进行了编译&运行,效果很好,当我看到使用JAD反编译器编译的代码时,我的HelloWorld程序实现了GroovyObject接口,但它没有实现该接口中的所有方法,所以这意味着只有java编译器强制我们实现接口中的所有方法,但JVM不需要。我说得对吗 这是反编译的groovy代码: import groovy.lang.GroovyObject; import groovy.lang.MetaClass;
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 {}
}
请任何人帮助……我可以在使用Groovy控制台时看到GroovyObject的实现。为了显示生成的源代码,我选择脚本,检查Ast,并在阶段结束时选择类生成。我还可以通过选择bytecode选项卡来查看生成的字节码
我相信负责实现GroovyObject方法的源代码位于org.codehaus.groovy.classgen.Verifier中。有一个名为addGroovyObjectInterfaceAndMethods的方法。您可以在中找到源代码。我认为如果将问题拆分为两个会更好。我将问题拆分为两个。$getCallSiteArray也没有声明。我上面发布的代码是反编译代码[我使用了JAD反编译器]我尝试使用jd gui进行反编译。得到了类似的结果,调用了一些未声明的方法。也许groovy会使用代理来添加功能。谢谢您的回答。我在groovy控制台中看到了AST转换,但是AST转换发生在编译时,那么我们编译的代码为什么在JVM中工作呢?在编译源代码时,groovy使用ASM库生成方法,包括GroovyObject的实现。生成的类应该是有效的JVM类。我以前没用过JAD。尝试使用JDK中的javap工具,例如javap-p-cmyclass,您将看到接口中的所有方法都存在。噢,很好。谢谢您的帮助。