2

「Predic8」の「SOA-Model」というライブラリを使っています。コードはここにあります。

ライブラリの一部のコードは Groovy で記述されていますが、私はこのライブラリを Java アプリケーションから使用しています。「ResourceResolver」を拡張したクラス「ExternalResolver」を書こうとしています。これは、こちらのサンプル コードに似ています。そして、ResourceResolver のソースコードはここにあると思います。

ただし、私はこれを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
4

1 に答える 1

2

GroovyObjectSupport回避策として、これらのメソッドを実装する際にコードをコピーしてみてください。次に例を示します。

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

クラスにもmetaClassフィールドを作成します

于 2013-05-29T14:07:13.567 に答える