gpt4 book ai didi

跨类加载器的 Java 8 ScriptEngine

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:48 26 4
gpt4 key购买 nike

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

我是否需要在每个类加载器中创建新的 ScriptEngine 实例,还是可以跨类加载器共享一个?

最佳答案

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

Nashorn 和类加载器:

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

(1) 和(2) 不能定制。 nashorn 代码假设它是特权代码。并且有关于生成的脚本类加载器和适配器加载器的假设。

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

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

如果您可以使用 NashornScriptEngineFactory(nashorn 特定 API 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

希望这对您有所帮助。

关于跨类加载器的 Java 8 ScriptEngine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30225398/

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