Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GroovyClassLoader-将解析的类添加到类路径_Java_Groovy_Classpath_Classloader - Fatal编程技术网

Java GroovyClassLoader-将解析的类添加到类路径

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

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

根据我使用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中使用。