2015-05-21 16 views
5

Ich habe ein Problem mit der Vererbung in Groovy-Skript. Ich möchte, dass mein Groovy-Skript Methoden von der Java-Klasse erbt, die ich dieses Skript aufruft.Java + Groovy Script - Vererbung

Zum Beispiel, ich habe so etwas wie dies:

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"; 
} 
} 

Und der Fehler ist:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script1.groovy: 1: Declared type com.test.SimpleTest does not extend groovy.lang.Script class! @ line 1, column 1. println sayHello() ^ 1 error

Wie kann ich dies tun, wenn ich eine andere Klasse nicht erben können? Ich möchte Methode nur nur wie von Superklasse aufrufen.

bearbeiten

änderte ich meine Klasse zu etwas wie folgt aus:

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()"); 
    } 
} 
} 

Jetzt ist der Fehler:

java.lang.NoSuchMethodError: com.test.SimpleTest$GroovyHandler: method < init >()V not found at Script1.(Script1.groovy) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at org.codehaus.groovy.runtime.InvokerHelper.createScript(InvokerHelper.java:429) at groovy.lang.GroovyShell.parse(GroovyShell.java:704) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:588) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:627) at groovy.lang.GroovyShell.evaluate(GroovyShell.java:598) ...

Antwort

0

Die Klasse, die im Skript verwendet werden soll muss sich erweitern Script

Beispiel:

class ScriptTest extends Script { 
    def SayHello() { 
     return "Hello" 
    } 
} 

Dann sind Sie setScriptBaseClass zu dieser besonderen Klasse

+0

seit der oben ist imho die Antwort auf die ursprüngliche Frage, die ich hier nur hinzufügen: 'com.test.SimpleTest $ GroovyHandler' zeigt an, dass Ihre Skript Basisklasse ist eine innere Klasse und ich es übernehmen ist keine statische innere Klasse. Java fügt in diesem Fall keinen parameterlosen Konstruktor hinzu, da die innere Klasse die äußere Klasseninstanz annehmen muss. Also mach einfach die Klasse statisch und alles ist in Ordnung – blackdrag