Java GroovyClassLoader-将解析的类添加到类路径
我有一个库,它允许客户端提供一个文本文件列表,每个文本文件都包含扩展java类Z的类的groovy代码Java GroovyClassLoader-将解析的类添加到类路径,java,groovy,classpath,classloader,Java,Groovy,Classpath,Classloader,我有一个库,它允许客户端提供一个文本文件列表,每个文本文件都包含扩展java类Z的类的groovy代码 package com.mypkg; public class A extends Z { @Override public void someMethod() { // do something A-ish } } 等等 库编译其中的每一个,在这种情况下,将向客户端返回一个Z类型的实例 当客户需要这样的东西时,我的问题就来了: package
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.根据我使用Groovy类加载器的经验,Groovy类加载器与Ant和beanshell的类加载器在这方面的行为类似,您必须事先决定是否要使用默认的系统类加载器,在这种情况下,您将类路径构建到启动Groovy脚本的命令中,另一方面,在命令行类路径上只指定groovy jar,然后在定制类加载器上的groovy脚本开头动态添加类 在您的问题中,您没有提供太多信息,但我的猜测是,您在启动脚本之前将类A放在类路径上,然后尝试动态加载类B。据我所知那是行不通的
注:我自己也一直在想如何做这类事情。这似乎是可能的,但我仍然没有弄明白。根据我使用Groovy类加载器的经验,Groovy类加载器与Ant和beanshell的类加载器在这方面的行为类似,您必须事先决定是否使用默认的系统类加载器,在这种情况下,您可以将类路径构建到启动Groovy脚本的命令中,或者另一方面,在命令行类路径上只指定Groovy jar,然后在自定义类加载器上的Groovy脚本的开头动态添加类 在您的问题中,您没有提供太多信息,但我的猜测是,您在启动脚本之前将类A放在类路径上,然后尝试动态加载类B。据我所知那是行不通的
注:我自己也一直在想如何做这类事情。这似乎是可能的,但我还没有弄明白。你能给你的问题补充一点细节吗?例如,您没有显示如何在中定义变量。“in”只是列表中的源代码。通过一些上下文进行了澄清。您可以添加启动Groovy脚本的命令吗?这些脚本永远不会“启动”。它们创建类Z的子类的实例,然后在java中使用?例如,您没有显示如何在中定义变量。“in”只是列表中的源代码。通过一些上下文进行了澄清。您可以添加启动Groovy脚本的命令吗?这些脚本永远不会“启动”。它们创建类Z的子类的实例,然后在java中使用。