Groovy lookupScriptFiles";“真的”;在loadClass()方法中

Groovy lookupScriptFiles";“真的”;在loadClass()方法中,groovy,groovyclassloader,Groovy,Groovyclassloader,扩展的GroovyClassloader和override loadclass方法 如果我在loadClass()方法中使lookupScriptFiles“true”,脚本将运行,并且不需要引用其他包中groovy类的导入语句 我扩展了GroovyClassloader,并重写了loadclass方法,在loadclass中,参数lookupScriptFiles=true 如果这是真的,它甚至可以成功编译第一个。groovy没有import语句 当lookupScriptFiles=fals

扩展的GroovyClassloader和override loadclass方法

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

我扩展了GroovyClassloader,并重写了loadclass方法,在loadclass中,参数
lookupScriptFiles=true

如果这是真的,它甚至可以成功编译第一个。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);
    }
}
我的源代码片段
C:\>cat first.groovy
def cos=新的第二个()
==============================================================
C:>cat Second.groovy
包com.test
二等
{
第二()
{
印地安尼斯
}
}
=========================================================
C:\bin>echo%CLASSPATH%
C:\zGroovy\bin;C:\vsexclude\opt\groovy-1.7.2\embeddeble\groovy-all-1.7.2.jar
===============================================
C:\vsexclude\trees\bac-4.2\workspace\zGroovy\bin>java GCtest
路径------->>C:\first.groovy
安尼什
=================================
导入groovy.lang.GroovyClassLoader;
导入org.codehaus.groovy.control.compiledFailedException;
导入org.codehaus.groovy.control.CompilerConfiguration;
/**
*@作者安妮什
*/
公共类GCloader扩展了GroovyClassLoader{
公共GCloader(类加载器父级){
超级(父级,新编译器配置());
}
@凌驾
公共类loadClass(最终字符串名、布尔查找脚本文件、,
boolean preferClassOverScript,布尔解析)
抛出ClassNotFoundException、CompliationFailedException{
//返回加载文件(名称、true、preferClassOverScript、resolve);
返回super.loadClass(名称,true,
preferClassOverScript,resolve);
}
}

假设您的问题是:

如果将
lookupScriptFiles
设置为
true
,是否可以从groovy脚本中删除导入语句

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


使现代化 因此,在同一目录中有两个groovy文件,其中一个任意添加了包语句

我假设您直接从脚本加载类(还有一件事您在问题中没有说)

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

如您所见,如果您不这样做,它将不起作用(导入或不导入)


然而,将两个groovy文件放在同一个文件夹中,仅仅在其中一个文件夹中添加一个包行,这是一种糟糕的编码实践,我很惊讶您能得到任何有用的东西

这是一个问题吗?你能更具体地说明你在问什么吗?@tim_yates更新了Snipedhi tim我有完整的程序来演示这个问题,如果你愿意,我可以把它发布到forum@anish仍然不理解这个问题,现在(如果有什么的话)有点混乱…抱歉,如果我冷让你理解,让我再次尝试澄清,我有两个groovy脚本(first.groovy,second.groovy)first.groovy没有包声明,并引用包中定义的second.groovy,这两个groovy文件位于同一位置,我的java programee(GCloader)扩展了GroovyClassloader,我在显式传递true的地方重写loadclass(),如果这是真的,我可以编译和运行脚本,没有任何错误,如果这是假(lookupScriptFiles),脚本不会编译并抛出预期的错误exception@anish所以如果你告诉它不要找脚本,那么它就找不到脚本了?这不是预期的行为吗?正如我所说,我看不出这个问题,这不是预期的行为吗?这方面的文档在哪里,这就是我试图弄清楚的,它在groovy类加载器中扮演什么角色,我应该将脚本放在defualt文件夹或包声明中的什么位置