首页 文章

GroovyClassLoader和导入

提问于
浏览
4

我在我的Java类中使用GroovyClassLoader来解析某个(理想情况下很复杂的)groovy文件(将在下一步执行):

Call in MyClass.java

final Class parsedClass = groovyClassLoader.parseClass(groovyFile);

知道:

  • Groovy文件需要存储在文件系统中,因为需要在不重新部署的情况下进行更改 .

  • 这个groovy文件需要几个导入:

GroovyFile.groovy imports

import com.my.import.one.Import1DTO
import com.my.import.two.Import2DTO
import com.my.import.three.Import3DTO
import com.my.import.four.Import4DTO
import com.my.import.five.Import5DTO

当调用parseClass方法时,此异常引发:

Exceptions

unable to resolve class com.my.import.one.Import1DTO;
unable to resolve class com.my.import.two.Import2DTO;
unable to resolve class com.my.import.three.Import3DTO;
unable to resolve class com.my.import.four.Import4DTO;
unable to resolve class com.my.import.five.Import5DTO;

在解析基类之前,我是否可以获得我期望的行为而不解析每个导入类?

谢谢!

1 回答

  • 5

    这是一个示例MyClass.java,它使用 GroovyClassLoader 上的 addClasspath() 方法

    import groovy.lang.GroovyClassLoader;
    
    public class MyClass {
        public static void main(String... args) {
            GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
    
            // add "lib" to the classpath
            groovyClassLoader.addClasspath("lib");
    
            String groovyFile = "GroovyFile.groovy";
            Class parsedClass = groovyClassLoader.parseClass(groovyFile);
            System.out.println("class is " + parsedClass.toString());
        }
    }
    

    我假设DTO是用Groovy编写的,我们使用“myimport”,因为“my.import.x”会因非法语法而失败 . 如果我们有一个像这样的“lib”目录,那么编译后的类:

    lib/com/myimport/one/Import1DTO.groovy
    lib/com/myimport/one/Import1DTO.class
    lib/com/myimport/two/Import2DTO.groovy
    lib/com/myimport/two/Import2DTO.class
    

    并且GroovyFile.groovy存在于主目录中 . 例如

    import com.myimport.one.Import1DTO
    import com.myimport.two.Import2DTO
    
    println "hi there"
    

    那么上面的Java代码对我有用 .

    我在类路径上使用Groovy 2.2.1和groovy-all-2.2.1.jar(对于GroovyClassLoader) .

相关问题