0

扩展 GroovyClassloader 并覆盖 loadclass 方法

如果我在方法中创建lookupScriptFiles“ ”,则脚本运行并且不需要引用不同包中的 groovy 类的导入语句trueloadClass()

我已经扩展了 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);
    }
}
4

1 回答 1

0

假设你的问题是:

如果我设置lookupScriptFilestrue,我可以从我的 groovy 脚本中删除导入语句吗?

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


更新

因此,您在同一个目录中有两个 groovy 文件,您在其中一个文件中任意添加了 package 语句。

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

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

如果你不这样做——正如你所见——它将不起作用(导入或不导入)

但是,将两个 groovy 文件放在同一个文件夹中,然后只在其中一个文件中添加一个包行是糟糕的编码实践,我很惊讶你有任何工作

于 2012-01-12T10:03:41.673 回答