Компилятор groovy

Связи
  • jandcode.commons.UtGroovy (class)
  • jandcode.commons.groovy.GroovyCompiler (class)

В приложение можно встроить компилятор groovy.

Для начала необходимо создать компилятор:

GroovyCompiler compiler = UtGroovy.createCompiler();

Не нужно создавать большое количество компиляторов, кэшируйте их.

Для получения класса из текста скрипта используется метод компилятора getClazz, например:

FileObject fo1 = UtFile.getFileObject("myscript.groovy"); // как-то получаем FileObject
GroovyClazz c1 = compiler.getClazz(MyBaseClass.class, "void run()",
        fo1, false);
MyBaseClass inst1 = (MyBaseClass) c1.createInst();
inst1.run();

где MyBaseClass:

public class MyBaseClass {
    public void run() {
    }
}

Текст myscript.groovy:

println('hello!')

Принцип простой: создается текст определения класса, который является потомком базового класса, который передан первым параметром (в данном случае MyBaseClass). Затем для класса создается метод, сигнатура которого переданна во втором параметре (в данном случае void run()). Текст, загруженный из указанного третьм параметром файла, становится телом метода run. Последним параметром указывается, что текст скрипта не шаблон. Если указать true, текст скрипта будет рассматриваться как шаблон gsp.

В качестве сигнатуры можно указать не сигнатуру метода, а следующие значения:

  • "body". В этом случае текст скрипта рассматривается как тело класса
  • "class". В этом случае текст скрипта рассматривается как полное описание класса

Также можно загружать текст скрипта из строковой переменной:

GroovyClazz c2 = compiler.getClazz(MyBaseClass.class, "void run()",
        "print('hello!')", false);
MyBaseClass inst2 = (MyBaseClass) c2.createInst();
inst2.run();

Полученный экземпляр GroovyClazz содержит методы для получения скомпилированного java-класса (getClazz), получения исходников скрипта и др.