Java类扩展了Groovy类

时间:2013-05-27 17:06:02

标签: java intellij-idea groovy soa-model

我正在使用名为“SOA-Model”的库,“Predic8”。可以找到代码here

库的一些代码是用Groovy编写的,但我在Java应用程序中使用这个库。我正在尝试编写一个扩展“ResourceResolver”的类“ExternalResolver”。它类似于找到here的示例代码。我认为可以找到ResourceResolver的源代码here

但是,我在 Java 中写这个,类似这样:

import com.predic8.schema.Import;
import com.predic8.xml.util.ResourceResolver;

public class ExternalWSDLResolver extends ResourceResolver {

    public Object resolve(Object input, String baseDir){
        //some code here to do the customised resolving
    }
}

现在,如果在Eclipse中进行编译,上面的工作正常。

然而,当我尝试在IntellijIDEA上编译时,它迫使我实现了更多的方法。基本上是实现的方法:

 - implements groovy.lang.GroovyObject.invokeMethod(String s, Object o)
 - implements groovy.lang.GroovyObject.getProperty(String s)
 - implements groovy.lang.GroovyObject.setProperty(String s, Object o)
 - implements groovy.lang.GroovyObject.getMetaClass()
 - implements groovy.lang.GroovyObject.setMetaClass(MetaClass metaClass)

对于大多数人来说,只需返回“null”即可。但是,如果我为getMetaClass执行此操作,我的代码将无效,并返回异常。

因此我需要知道:

  • 有没有办法可以在Intellij上关闭这些警告? ......或者
  • 我可以把它放到getMetaClass中让它运行起来吗?即一种默认值。

修改

正如在反馈ResourceResolver.class的注释中所建议的那样,这里是getMetaClass的结果。

另外,作为参考,我已在此处粘贴了整个输出:http://pastie.org/7980007

public groovy.lang.MetaClass getMetaClass();
  Code:
   0:   aload_0
   1:   getfield    #27; //Field metaClass:Lgroovy/lang/MetaClass;
   4:   dup
   5:   ifnull  9
   8:   areturn
   9:   pop
   10:  aload_0
   11:  dup
   12:  invokevirtual   #25; //Method $getStaticMetaClass:()Lgroovy/lang/MetaClass;
   15:  putfield    #27; //Field metaClass:Lgroovy/lang/MetaClass;
   18:  aload_0
   19:  getfield    #27; //Field metaClass:Lgroovy/lang/MetaClass;
   22:  areturn

1 个答案:

答案 0 :(得分:2)

作为一种解决方法,您可以尝试在实现这些方法时复制GroovyObjectSupport代码,例如:

    public MetaClass getMetaClass() {
        if (metaClass == null) {
            metaClass = InvokerHelper.getMetaClass(getClass());
        }
        return metaClass;
    }

并在您的班级中创建一个metaClass字段