在loadClass()方法中lookupScriptFiles为“true”

时间:2012-01-12 09:06:24

标签: groovy groovyclassloader

扩展GroovyClassloader并覆盖loadclass方法

如果我在lookupScriptFiles方法中使trueloadClass()”脚本运行,并且不需要引用其他包中的groovy类的import语句

我已经扩展了GroovyClassloader,并在loadclass中覆盖了loadclass方法,参数lookupScriptFiles =true

如果这是真的,它甚至可以成功编译first.groovy没有import语句

lookupScriptFiles=false按预期抛出编译错误时。

my source code snippet

    C:\>cat first.groovy
def cos=new Second()
==============================================================
C:>cat Second.groovy
package com.test
class Second
{
Second()
{
        println "Anish"
}

}
=========================================================

C:\bin>echo %CLASSPATH%
C:\zGroovy\bin;C:\vsexclude\opt\groovy-1.7.2\embeddable\groovy-all-1.7.2.jar
===============================================
C:\vsexclude\trees\bac-4.2\workspace\zGroovy\bin>java GCtest
path------>>C:\first.groovy
Anish
=================================

import groovy.lang.GroovyClassLoader;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilerConfiguration;
/**
 * @author Anish
 */
public class GCloader extends GroovyClassLoader {
    public GCloader(ClassLoader parent) {
        super(parent, new CompilerConfiguration());
    }
    @Override
    public Class<?> loadClass(final String name, boolean lookupScriptFiles,
            boolean preferClassOverScript, boolean resolve)
            throws ClassNotFoundException, CompilationFailedException {
        //return loadFiles(name, true, preferClassOverScript, resolve);
        return super.loadClass(name, true,
                preferClassOverScript, resolve);
    }
}

1 个答案:

答案 0 :(得分:0)

假设您的问题是:

  

如果我将lookupScriptFiles设置为true,我可以从我的groovy脚本中删除import语句吗?

然后答案是否定的。类加载器将尝试查找它不知道的脚本,但是仍然需要导入以告诉它在哪个包中查找每个类


更新

所以,你在同一个目录中有两个groovy文件,其中一个你随意添加了一个package语句。

我假设你是直接从脚本加载课程(还有一件事你没有在你的问题中说)

如果是这种情况,那么您需要告诉类加载器查找其他脚本以编译到类。

如果你没有 - 如你所见 - 它将无效(进口或无进口)

然而,将两个groovy文件放在同一个文件夹中,只是在其中一个文件夹中添加一个包行是一个糟糕的编码习惯,我很惊讶你有什么工作