跨类加载器的 Java 8 ScriptEngine

2024-05-21

我需要在不同的类加载器“内部”执行一些 JavaScript 代码。如果是java,每个任务将在单独的类加载器中运行。现在我需要它是 javascript。

我需要创建新实例吗ScriptEngine在每个类加载器中,或者可以跨类加载器共享一个吗?


从您的问题来看,尚不清楚您为什么要寻找这种类加载器隔离。所以,我在这里总结了 nashorn 的类加载器 - 也许,您会得到您正在寻找的东西。

Nashorn 和类加载器:

  1. Nashorn 类 (jdk.nashorn.*) 由 Java 扩展类加载器加载
  2. 生成的脚本类、适配器(子类、脚本的接口实现)由 nashorn 的内部类加载器加载。
  3. 从脚本引用的 Java 类由 Nashorn“应用程序类加载器”加载。

(1) 和 (2) 无法定制。 nashorn 代码中存在这样的假设:它是特权代码。并且有关于生成的脚本类加载器和适配器加载器的假设。

(3) 默认情况下是 nashorn 引擎创建时的线程上下文类加载器。如果线程上下文类加载器为 null,则使用 Nashorn 自己的加载器(扩展加载器)。

因此,如果您通过 Thread.setContextClassLoader API 设置合适的线程上下文加载器后创建 Nashorn 引擎,则可以控制脚本引擎的“应用程序类加载器”。

如果您可以使用 NashornScriptEngineFactory (nashorn 特定 APIhttps://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html)要创建脚本引擎,您也可以以编程方式将任何类加载器作为“应用程序类加载器”传递。您可能想查看接受 ClassLoader 参数的 NashornScriptEngineFactory 方法。

除了“应用程序类加载器”之外,您还可以选择使用在“应用程序类加载器”之前搜索的另一个附加类加载器。这是由“-cp”或“-classpath”nashorn 命令行选项指定的。请注意,您可以通过“nashorn.args”系统属性指定脚本引擎的 nashorn 命令行选项,或使用 NashornScriptEngineFactory 类的 getScriptEngine 方法以编程方式传递。也可以看看:https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨类加载器的 Java 8 ScriptEngine 的相关文章

随机推荐