将编译后的Nashorn输出作为Java类

5

是否可以将Nashorn计算的Javascript输出转换为Java类文件以供以后调用?(类似于JSP-->Java-->类文件)

我有一个Javascript文件,它被Nashorn用来生成HTML输出。该Javascript文件具有不同的组件函数,每个组件函数用于生成其对应的HTML输出。这些组件函数通过“renderServer”函数动态调用,该函数接受组件名称和该组件的JSON数据。

private ScriptEngine nashorn;
ScriptEngineManager scriptEngineManager = new ScriptEngineManager(null);
        this.nashorn = scriptEngineManager.getEngineByName("nashorn");  
         this.nashorn.eval(new FileReader(jsFile);
String compName="myComponent1";// Component 1 name 
String jsonData="{....}";// JSON data input for myComponent
String formatted = "JSON.parse('" + jsonData + "')";

String htmlRender = "renderServer(\"" + myComponent1 + "\"," + formatted + ");";

Object finalResult = nashorn.eval(htmlRender);

我希望能够生成评估的编译输出,并像 那样调用java类,而不是每次通过传递组件名称和输入json来执行nashorn.eval。
这可行吗?


不,不可能。 - Pointy
@T.J.Crowder 你可以“包装”JavaScript,使其可以像Java一样调用,但这并不意味着实际上“编译”了JavaScript。它仍然是由Rhino评估的JavaScript,并且根据我对Nashorn的了解,我相信评估方法并不是将其转换为字节码。 - Pointy
话虽如此,我想象同样的方法可以用于创建类似Java方法调用接口的JavaScript方法。虽然我已经好几年没做过了,但我可能还能找到源代码 :) - Pointy
@Pointy:这并不适用于Rhino。Rhino将JavaScript代码编译为JVM字节码并执行它。如果您喜欢,可以输出类文件:https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/JavaScript_Compiler 我还没有深入研究Nashorn,因此我才会提出上面的问题。 - T.J. Crowder
在我的旧代码中,我/我们只是简单地委托给了一个ScriptEngine实例。我不记得我是否曾经尝试过使用Java代理方法。编辑啊好吧,你可能是对的,但我只是通过ScriptEngine接口使用过Rhino。据我所知,Nashorn只通过该接口公开。几年前,在奇怪的循环中有一个关于内部工作方式的演示,它似乎与Rhino有很大不同。 - Pointy
显示剩余2条评论
1个回答

2

不行。没有办法将nashorn生成的字节码持久化,然后像普通的Java类一样使用它。有一个未记录/不支持的"--persistent-code-cache"选项,可以启用编译脚本的磁盘缓存,但这仍然是由Nashorn内部使用的。您无法通过任意类加载器加载这些类,并从您的Java代码中调用其方法。


在使用jjs命令时,是否应该使用“--persistent-code-cache”选项? - R Jos
是的,没错。但请注意,这是一个未记录/不支持的选项。 - A. Sundararajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接