我正在编写一个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()的正确建议方法。
答案 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
这也是预期的行为。