关于通过自定义编译过程在Groovy中添加导入包

时间:2014-03-29 09:21:18

标签: java grails groovy junit

我正在编写一个java文件,我在其中使用GroovyClassLoader解析给定的groovy文件以查找其中的类。为此,我必须导入一些类(如org.junit.Test)并添加包并添加静态导入。由于我使用旧的groovy版本1.6,我不能使用编译定制器,因为这个版本中没有这些类。因此要导入自定义类,我必须通过扩展groovy类加载器类来编写自定义groovy类加载器,如下所示,

...

public static class DefaultImportClassLoader extends GroovyClassLoader {
public DefaultImportClassLoader(ClassLoader cl){
    super(cl);
}

public CompilationUnit createCompilationUnit(CompilerConfiguration config, CodeSource codeSource) {
         CompilationUnit cu = super.createCompilationUnit(config, codeSource);
         cu.addPhaseOperation(new SourceUnitOperation() {
         public void call(SourceUnit source) throws CompilationFailedException {
             //source.getAST().addImport("Test",ClassHelper.make("org.junit.Test")); //working
        source.getAST().addImportPackage("org.junit.");
        }}, Phases.CONVERSION);

        return cu;
    }

}

这里添加导入包不起作用。任何人都会给出使用addImportPackage()的正确建议方法。

1 个答案:

答案 0 :(得分:2)

我已经测试过您的代码并且对我来说非常适合。 (使用groovy-all-1.6.9.jar)(编辑:groovy-all-1.6.0.jar也可以正常工作)
你如何使用你的班级DefaultImportClassLoader
我已经完成了:

    public static void main(String[] args) throws InstantiationException, IllegalAccessException{
        GroovyClassLoader loader = new DefaultImportClassLoader(new GroovyClassLoader());
        Class groovyClass = loader.parseClass(DefaultImportClassLoader.class.getClassLoader().getResourceAsStream("so_22729226/test.groovy"));
        GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
        groovyObject.invokeMethod("run", null);
    }

使用这个Groovy类:

class so_22729226_Test {
    def run(){
        print Test.class
    }
}

我得到了预期的输出:interface org.junit.Test

如果我使用标准装载机,我会得到:

 Caused by: groovy.lang.MissingPropertyException: No such property: Test for class: so_22729226_Test

这也是预期的行为。