java - 在运行时从 Java 编译和使用 Groovy 类?

标签 java groovy compilation interpreter

我有一个应用程序,我想通过让用户在 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/

相关文章:

java - 在不卡住主线程的情况下在 Espresso Android 中进行延迟测试

grails - 在过滤器中访问params.id时遇到问题

groovy - XML 合并文档

c++ - 几乎为空的 .exe 文件的重量是由什么造成的?

java - 生成不重复的随机数数组

Java 字符串到字节数组的错误转换

Groovy 控制台读取输入

c++ - 使用模板参数模板解决不明确调用的 C++ 默认行为是什么?

c - 编译大量代码生成的源文件的任何提示?

java - 如何找出屏幕上显示的java组件