【问题标题】:Compiling and using Groovy classes from Java at runtime?在运行时从 Java 编译和使用 Groovy 类?
【发布时间】:2013-06-03 17:59:04
【问题描述】:

我有一个应用程序,我想通过让用户在 Groovy 中定义类,最终实现一些接口来使其具有可扩展性。

关键方面是它应该在运行时被解释/编译。 IE。我需要我的应用程序获取.groovy 并编译它。在启动时这样做是可以的。

那么,当然,我的应用应该能够实例化该类。

我看到了两种解决方案:

1) 在应用程序运行时编译,将类放在类路径中的某个位置,然后只加载类,假装它们一直在那里。

2) 一些更聪明的方法 - 调用编译器 API 和一些类加载魔法让我的系统类加载器看到它们。

我将如何执行选项 2)?
还有其他想法吗?

【问题讨论】:

    标签: java groovy compilation interpreter


    【解决方案1】:

    看看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!";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-05
      • 2010-12-11
      • 1970-01-01
      • 2012-05-25
      • 2016-03-05
      相关资源
      最近更新 更多