2013-06-03 14 views
11

Ich habe eine App, die ich erweiterbar machen möchte, indem ich Benutzern die Möglichkeit gebe, in Groovy Klassen zu definieren und schließlich einige Schnittstellen zu implementieren.Kompilieren und Verwenden von Groovy-Klassen aus Java zur Laufzeit?

Der Schlüsselaspekt ist, dass es zur Laufzeit interpretiert/kompiliert werden sollte. I.e. Ich brauche meine App, um die .groovy zu nehmen und es zu kompilieren. Es während des Bootens zu tun ist in Ordnung.

Dann sollte natürlich meine App diese Klasse instanziieren können.

Ich sehe zwei Lösungen:

1) Kompilieren, während die App läuft, die Klassen auf Classpath irgendwo setzen, und dann nur die Klassen laden, sie immer vorgibt waren.

2) Eine etwas schlauere Methode - Aufruf einer Compiler-API und etwas Classloading-Magie, damit mein System-Classloader sie sehen kann.

Wie würde ich Option 2) tun?
Irgendwelche anderen Ideen?

Antwort

8

Werfen Sie einen Blick auf Integrating Groovy into applications

  • Get Klasse Loader
  • Belastungsklasse
  • Instantiate Klasse.

Beauty: -
Seit .groovy-.class Bytecode kompiliert, würde die Klasse Parsen geben Sie eine instanceofClass. Jetzt wird es alles JAVA Welt, nur Unterschied, sobald Sie GroovyObject nach Instantiierung erhalten, spielen Sie herum, Methoden auf Anforderung aufrufend.

Edit: Nur so ist es hier enthalten:

InputStream groovyClassIS = GroovyCompiler.class 
    .getResourceAsStream("/org/jboss/loom/tools/groovy/Foo.groovy"); 

GroovyClassLoader gcl = new GroovyClassLoader(); 
Class clazz = gcl.parseClass(groovyClassIS, "SomeClassName.groovy"); 
Object obj = clazz.newInstance(); 
IFoo action = (IFoo) obj; 
System.out.println(action.foo()); 

und

package org.jboss.loom.migrators.mail; 

import org.jboss.loom.tools.groovy.IFoo; 

public class Foo implements IFoo { 
    public String foo(){ 
     return "Foooooooooo Action!"; 
    } 
} 
Verwandte Themen