我有一个库,允许客户端提供文本文件列表,每个文本文件都包含扩展java类Z的类的groovy代码。例如,文件'A.groovy‘包含
package com.mypkg;
public class A extends Z {
@Override
public void someMethod() {
// do something A-ish
}
}等。
库编译其中的每一个,并且(在本例中)将返回给客户端一个类型为Z的实例。
当客户需要这样的东西时,我的问题就来了:
package com.mypkg;
public class B extends A { // extends A!
@Override
public void someMethod() {
// do something B-ish instead of A-ish
}
}其中B扩展A,A类在B类之前被解析。
问题是,GroovyClassLoader似乎找不到A类,尽管它只是解析了A。下面是编译脚本和创建实例的代码:
for (String fileName : listOfScriptFiles) {
InputStream in = getInputStreamFromFile(fileName);
CompilerConfiguration compConfig = new CompilerConfiguration();
GroovyClassLoader classLoader = new GroovyClassLoader(Thread.currentThread()
.getContextClassLoader(), compConfig);
Z service = null;
Class clazz = classLoader.parseClass(in);
service = (Z) clazz.newInstance();
return service;
}有没有办法在运行时“注册”A类,以便Groovy在尝试编译类B时不会抱怨A类不存在?
更新
实际上,我能够通过在循环之外实例化遍历客户端代码列表的GroovyClassLoader来解决这个问题,所以解析A的类加载器与解析B的类加载程序是一样的。
但问题仍然存在,因为我可以设想这样一种情况:在某个代码的一部分中,他们解析A,然后在一个完全不同的部分中,在同一个类加载程序不可用的情况下,它们解析B。
发布于 2012-04-30 18:01:21
在我使用Groovy类加载器的经验中(在这方面,Ant和beanshell的类加载器的行为类似),您必须预先决定是否要使用默认的系统类加载器,在这种情况下,您需要将类路径构建到启动Groovy脚本的命令中,或者另一方面,在命令行classpath上只指定groovy jar,然后在自定义类加载器上的Groovy脚本开始时动态地添加类。
您没有在问题中提供太多信息,但我猜您在启动脚本之前将类"A“放到类路径上,然后尝试动态加载类"B”。据我所知,那是行不通的。
注意:我自己一直在努力想办法做这类事情。这似乎是可能的,但我还没有弄清楚。
https://stackoverflow.com/questions/10388184
复制相似问题