- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个库,允许客户端提供文本文件列表,每个文件都包含用于扩展 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/
我在 Java 类中使用 GroovyClassLoader 来解析某个(理想情况下是复杂的)groovy 文件(将在下一步中执行): 调用 MyClass.java final Class pars
我正在构建一个Grails应用程序,该应用程序允许用户编写Groovy代码,然后在我的框架内执行该代码。当然,这是一个巨大的安全威胁,因为用户可能输入恶意代码。 Groovy类正在使用GroovyCl
我有一个库,允许客户端提供文本文件列表,每个文件都包含用于扩展 java 类 Z 的类的 groovy 代码。例如文件“A.groovy”包含 package com.mypkg; public cl
我正在调查一些 JVM bsaed 代码(在 Java 环境中运行的 groovy)中的内存泄漏。 我有一个简单的 Java 测试类,用于调查 Groovy 类加载的各种行为,并且我正在运行以下代码(
我正在尝试使用 GroovyClassLoader 和 GroovyScriptEngineImpl 在我的 Java 应用程序中运行 Groovy 脚本,并且我想将 Groovy 脚本与父应用程序上
不幸的是,我们遇到了 PermgenError。 jmap -permstat 返回如下内容: 0x00000006c17f8520 1 1968 0x00000006ad000000
我正在加载大量 Groovy (2.4.6) 脚本并使用 GroovyScriptEngineImpl 运行它们在我的 Java 8 应用程序中,一段时间后我遇到了问题。 有几件事你需要知道: 我必须
我看到类似的代码 GroovyClassLoader cLoader = new GroovyClassLoader(this.class.getClassLoader()) 后面是这样的: cLoa
我正在尝试将 Groovy 脚本作为类动态加载,但即使脚本的代码未编译,也会创建类对象。 例如,我的用于加载 Groovy 脚本的 Groovy 代码的简化版本如下: GroovyCodeSource
我有一个 Java 7 项目,每 n 分钟由 n 个进程运行脚本。以下是运行脚本的代码示例。 ScheduledFuture scheduledFuture = scheduledService.sc
我需要从我的 Java 应用程序运行一些外部代码,这些代码将经常更新并与应用程序的其余部分正交。由于我不会为每次代码更改(以及其他原因)重新部署整个应用程序,我们选择使用 groovy对于此代码,并将
我注意到 scala 符合 jsr 223 https://issues.scala-lang.org/browse/SI-874 ...但是它能够做像 GroovyScriptEngine 这样的事
我在 java 中创建了一个自定义类,用于自定义加载 Groovy 类。 我的 Java 类是这样开始的: public class ClassLoader { private GroovyC
我正在尝试在java中使用GroovyClassLoader来执行Groovy类中的方法。 我创建了一个Java类,公共(public)方法创建了一个GroovyClassLoader的实例,pars
我正在尝试获取动态生成的groovy 脚本来继承类并实现调用java 程序的接口(interface)。我正在传递评估 groovy 脚本的类的类加载器,但没有效果。我想知道我是否可以询问一位 Gro
目前我正在研究一种以字符串形式运行java代码的方法。这就是我的做法。 import java.util.HashMap; import java.util.Map; import groovy.la
我有一个像这样的 groovy 脚本: @Grab('com.univocity:univocity-parsers:2.0.0') import com.univocity.parsers.csv.
我是一名优秀的程序员,十分优秀!