我有一个应用程序,我想通过让用户在 Groovy 中定义类,最终实现一些接口(interface)来使其可扩展。
关键方面是它应该在运行时被解释/编译。 IE。我需要我的应用程序获取 .groovy
并编译它。在启动期间执行它是可以的。
当然,我的应用程序应该能够实例化该类。
我看到两个解决方案:
1) 在应用程序运行时编译,将类放在类路径中的某个位置,然后加载类,假装它们一直在那里。
2) 一些更聪明的方法 - 调用编译器 API 和一些类加载魔法让我的系统类加载器看到它们。
我该怎么做选项 2)?
还有其他想法吗?
最佳答案
看看Integrating Groovy into applications
- 获取类加载器
- 加载类
- 实例化类。
美:-
由于 .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!";
}
}
关于java - 在运行时从 Java 编译和使用 Groovy 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902906/