2014-03-29 55 views
2

我正在編寫一個java文件,在該文件中我使用GroovyClassLoader來解析給定的groovy文件以在其中找到類。爲此,我必須導入一些類(如org.junit.Test)並添加包並添加靜態導入。因爲我使用的是舊版本的Groovy 1.6,所以我無法使用編譯定製器,因爲這些類在這個版本中不可用。所以導入自定義類,我不得不通過擴展Groovy類加載器的類象下面這樣編寫定製的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()的正確建議方式。

回答

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 

這也是預期的行爲。

+0

謝謝fonkap的回覆。 – Robo

+0

我正在運行,如下所示,以瞭解某些常規文件中的類名。 – Robo

+0

GroovyClassLoader classLoader = new GroovyScriptTestRun.DefaultImportClassLoader( GroovyScriptTestRun.class.getClassLoader()); scriptClass = classLoader.parseClass(filePath); System.out.println(「Script Class Name - >」+ scriptClass.getSimpleName()); – Robo

相關問題