gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:14:22 24 4
gpt4 key购买 nike

我有一个库,允许客户端提供文本文件列表,每个文件都包含用于扩展 java 类 Z 的类的 groovy 代码。例如文件“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,并且类 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 类加载器的经验(在这方面,它与 Ant 和 beanshell 的类加载器的行为相似),您必须预先决定是否要使用默认的系统类加载器,在这种情况下,您将构建将类路径添加到启动 Groovy 脚本的命令中,或者另一方面,您在命令行类路径中仅指定 groovy jar,然后在自定义类加载器上的 Groovy 脚本开头动态添加类。

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

注意:我自己一直在努力弄清楚如何做这种事情。看起来这是可能的,但我仍然没有弄清楚。

关于java - GroovyClassLoader - 将已解析的类添加到类路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10388184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com