[英]GroovyClassLoader - adding parsed classes to classpath
我有一个允许客户端提供文本文件列表的库,每个文本文件都包含用于扩展Java类Z的类的常规代码。例如,文件“ 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,并且在B类之前解析了A类。
问题是,即使GroovyClassLoader只是解析了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。
根据我对Groovy类加载器的经验(在这方面与Ant和beanshell的类加载器的行为类似),您必须预先决定是否要使用默认的系统类加载器,在这种情况下,应将类路径构建到启动Groovy脚本的命令,或者相反,您只能在命令行类路径上指定groovy jar,然后在自定义类加载器的Groovy脚本的开头动态添加类。
您没有在问题中提供太多信息,但是我的猜测是,您在启动脚本之前将类“ A”放在类路径上,然后尝试动态加载类“ B”。 据我所知,这是行不通的。
注意:我本人一直在尝试找出如何做这种事情。 似乎有可能,但我仍然没有弄清楚。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.