ClassLoaders中的Java 8 ScriptEngine

时间:2015-05-13 21:21:14

标签: java java-8 classloader nashorn

我需要执行一些javascript代码' inside'不同的类加载器。如果是java,则每个任务都将在单独的类加载器中运行。现在我需要这个是javascript。

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

1 个答案:

答案 0 :(得分:11)

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

Nashorn和类加载器:

  1. Nashorn类(jdk.nashorn。*)由Java扩展类加载器
  2. 加载
  3. 生成的脚本类,适配器(子类,脚本中的接口实现)由nashorn的内部类加载器加载。
  4. 从脚本引用的Java类由Nashorn“app class loader”加载。
  5. (1)和(2)无法定制。在nashorn代码中有一些假设它是一个特权代码。有关genarated脚本类加载器和适配器加载器的假设。

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

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

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

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

    希望这有帮助。