5

Groovy スクリプトの継承に問題があります。Groovy スクリプトが、このスクリプトを呼び出す Java クラスからメソッドを継承するようにします。

たとえば、次のようなものがあります。

public class SimpleTest extends TestCase {

public void test(){
    CompilerConfiguration configuration = new CompilerConfiguration();
    configuration.setScriptBaseClass(this.getClass().getName());
    GroovyShell shell = new GroovyShell(this.getClass().getClassLoader(), new Binding(), configuration);
    shell.evaluate("println sayHello()");
}

public String sayHello(){
    return "Hello";
}
}

エラーは次のとおりです。

org.codehaus.groovy.control.MultipleCompilationErrorsException: 起動に失敗しました: Script1.groovy: 1: 宣言された型 com.test.SimpleTest は groovy.lang.Script クラスを拡張しません! @ 行 1、列 1。println sayHello() ^ 1 エラー

他のクラスを継承できない場合、どうすればこれを行うことができますか? スーパークラスと同じようにメソッドを呼び出したい。

編集

クラスを次のように変更しました。

public class CmTest extends TestCase {

public void test(){
    GroovyHandler handler = new GroovyHandler();
    handler.run();
}

public String sayHello(){
    return "Hello";
}

public class GroovyHandler extends Script {

    public GroovyHandler(){
    }

    @Override
    public Object run() {
        CompilerConfiguration configuration = new CompilerConfiguration();
        configuration.setScriptBaseClass(this.getClass().getName());
        GroovyShell shell = new GroovyShell(CmTest.class.getClassLoader(), new Binding(), configuration);
        return shell.evaluate("println sayHello()");
    }
}
}

エラーは次のとおりです。

java.lang.NoSuchMethodError: com.test.SimpleTest$GroovyHandler: メソッド < init >() V が Script1.(Script1.groovy) で見つかりません。 newInstance(NativeConstructorAccessorImpl.java:39) の sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) の java.lang.reflect.Constructor.newInstance(Constructor.java:513) の java.lang.Class.newInstance0(Class) .java:355) で java.lang.Class.newInstance(Class.java:308) で org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:429) で groovy.lang.GroovyShell.parse(GroovyShell. java:704) で groovy.lang.GroovyShell.evaluate(GroovyShell.java:588) で groovy.lang.GroovyShell で。評価(GroovyShell.java:627) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:598) ...

4

2 に答える 2

0

私は自分の問題を解決しました。解決策はクラス DelegatingScript です。ドキュメントへのリンク: http://docs.groovy-lang.org/latest/html/gapi/groovy/util/DelegatingScript.html

于 2015-05-27T08:09:12.943 に答える