扩展GroovyClassloader并覆盖loadclass方法
如果我在lookupScriptFiles
方法中使true
“loadClass()
”脚本运行,并且不需要引用其他包中的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);
}
}
答案 0 :(得分:0)
假设您的问题是:
如果我将
lookupScriptFiles
设置为true
,我可以从我的groovy脚本中删除import语句吗?
然后答案是否定的。类加载器将尝试查找它不知道的脚本,但是仍然需要导入以告诉它在哪个包中查找每个类
所以,你在同一个目录中有两个groovy文件,其中一个你随意添加了一个package语句。
我假设你是直接从脚本加载课程(还有一件事你没有在你的问题中说)
如果是这种情况,那么您需要告诉类加载器查找其他脚本以编译到类。
如果你没有 - 如你所见 - 它将无效(进口或无进口)
然而,将两个groovy文件放在同一个文件夹中,只是在其中一个文件夹中添加一个包行是一个糟糕的编码习惯,我很惊讶你有什么工作