我有一个库,允许客户端提供一个文本文件列表,每个文件都包含扩展 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。