2013-06-03 39 views
11

Mam aplikację, którą chciałbym rozszerzyć, pozwalając użytkownikom definiować klasy w Groovy, ostatecznie implementując niektóre interfejsy.Kompilowanie i używanie klas Groovy z Java w czasie wykonywania?

Kluczowym aspektem jest to, że powinien być interpretowany/kompilowany w czasie wykonywania. To znaczy. Potrzebuję mojej aplikacji, aby pobrać .groovy i skompilować ją. Robiąc to podczas rozruchu jest w porządku.

Następnie, oczywiście, moja aplikacja powinna być w stanie utworzyć instancję tej klasy.

Widzę dwa rozwiązania:

1) Kompilacja natomiast działa aplikacja, umieścić gdzieś na ścieżce klasy klas, a potem po prostu załadować klasy, udając, że były one zawsze.

2) Trochę mądrzejszy sposób - wywołanie kompilatora API i niektórych klasowych magii, aby mój systemowy program ładujący mógł je zobaczyć.

Jak zrobić opcję 2)?
Jakieś inne pomysły?

Odpowiedz

8

Wystarczy popatrzeć na Integrating Groovy into applications

  • Get klasy Loader
  • klasa obciążenia
  • klasy instancji.

Beauty: -
Od .groovy kompiluje do kodu bajtowego .class, analizowania klasy nie daje instanceofClass. Teraz staje się to całym światem JAVA, tylko różnicą, gdy tylko uzyskasz GroovyObject po wystąpieniu instancji, grasz wokół wywoływania metod na żądanie.

Edit: Właśnie tak to zawarte tutaj:

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

i

package org.jboss.loom.migrators.mail; 

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

public class Foo implements IFoo { 
    public String foo(){ 
     return "Foooooooooo Action!"; 
    } 
} 
Powiązane problemy