2013-06-03 3 views
11

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

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

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

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

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

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

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

ответ

8

Посмотрите Integrating Groovy into applications

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

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

Edit: Просто так он содержится здесь:

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!"; 
    } 
} 
Смежные вопросы