繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM