首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GroovyClassLoader -向类路径添加解析类

GroovyClassLoader -向类路径添加解析类
EN

Stack Overflow用户
提问于 2012-04-30 17:50:25
回答 1查看 2K关注 0票数 2

我有一个库,允许客户端提供文本文件列表,每个文本文件都包含扩展java类Z的类的groovy代码。例如,文件'A.groovy‘包含

代码语言:javascript
复制
package com.mypkg;

public class A extends Z {

    @Override
    public void someMethod() {

        // do something A-ish

    }
}

等。

库编译其中的每一个,并且(在本例中)将返回给客户端一个类型为Z的实例。

当客户需要这样的东西时,我的问题就来了:

代码语言:javascript
复制
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。下面是编译脚本和创建实例的代码:

代码语言:javascript
复制
    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。

EN

回答 1

Stack Overflow用户

发布于 2012-04-30 18:01:21

在我使用Groovy类加载器的经验中(在这方面,Ant和beanshell的类加载器的行为类似),您必须预先决定是否要使用默认的系统类加载器,在这种情况下,您需要将类路径构建到启动Groovy脚本的命令中,或者另一方面,在命令行classpath上只指定groovy jar,然后在自定义类加载器上的Groovy脚本开始时动态地添加类。

您没有在问题中提供太多信息,但我猜您在启动脚本之前将类"A“放到类路径上,然后尝试动态加载类"B”。据我所知,那是行不通的。

注意:我自己一直在努力想办法做这类事情。这似乎是可能的,但我还没有弄清楚。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10388184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档