Компилирование и использование классов Groovy из Java во время выполнения?

У меня есть приложение, которое я хотел бы сделать расширяемым, позволяя пользователям определять классы в Groovy, в конечном итоге реализуя некоторые интерфейсы.

Ключевым аспектом является то, что его следует интерпретировать/компилировать во время выполнения. То есть Мне нужно мое приложение, чтобы взять .groovy и скомпилировать его. Выполнение этого при загрузке в порядке.

Тогда, конечно, мое приложение должно иметь возможность создать экземпляр этого класса.

Я вижу два решения:

1) Скомпилируйте во время запуска приложения, поместите классы где-нибудь в путь к классам, а затем просто загрузите классы, притворившись, что они всегда там.

2) Какой-то более разумный способ - вызов API компилятора и некоторая магия для загрузки классов, чтобы увидеть, как мой системный загрузчик классов видит их.

Как мне выбрать вариант 2)?
Любые другие идеи?

Ответ 1

Посмотрите Интеграция Groovy в приложения

  • Получить класс Loader
  • Класс нагрузки
  • Создание класса.

Красота: -
Поскольку .groovy компилируется в .class байт-код, разбор класса даст вам instanceof Class. Теперь это становится всем миром JAVA, только разница, как только вы получите GroovyObject после инстантации, вы играете вокруг методов вызова по запросу.

Изменить: просто он содержится здесь:

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

и

package org.jboss.loom.migrators.mail;

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

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