Tag: scriptengine

在java和javascript之间传递JSON的有效方法

我对Nashorn很新,并且在JVM之上编写脚本,并想知道我是否可以让我的java代码和javascripts更有效地进行通信。 我正在使用与JS对象一起使用的第三方JS库,在我的java代码中,我将要传递的数据作为Map data传递。 因为第三方JS希望使用普通的JS对象,所以我无法按原样传递data ,尽管脚本引擎允许您访问Map,就像它是一个普通的JS对象一样。 我正在使用的脚本在data参数上使用’hasOwnProperty’,并且在Java对象上调用时失败。 当我尝试使用Object.prototype.hasOwnProperty.call(data,’myProp’)时,它也不起作用并且总是返回’false’。 基本问题是Java Object不是javascript对象原型。 我最终做了这样的事情: Map data; ObjectMapper mapper = new ObjectMapper(); String rawJSON = mapper.writeValueAsString(data); ScriptEngine engine = new ScriptEngineManager().getEngineByName(“nashorn”); engine.eval(‘third_party_lib.js’); engine.eval(‘function doSomething(jsonStr) { var jsObj = JSON.parse(jsonStr); return doSomethingElse(jsObj); }’); Object value = ((Invocable) engine).invokeFunction(“doSomething”, rawJSON); 这可以按预期工作,但所有这些来回JSON解析很重,感觉可能有更简单,更快速和更直接的方式来做到这一点。 那么,有没有更好的方法在Java和Javascript之间传递JSON或者在我的Java代码中创建兼容的JS对象? 我已经看过使用mustache.js进行模板渲染的这个指南,但它做的几乎是一样的。 谢谢 !

如何检查Jython ScriptEngine查找python模块的类路径?

我有这个Java代码,我用它来运行使用Jython ScriptEngine的python script : StringWriter writer = new StringWriter(); ScriptEngineManager manager = new ScriptEngineManager(); ScriptContext context = new SimpleScriptContext(); context.setWriter(writer); ScriptEngine engine = manager.getEngineByName(“python”); engine.eval(new FileReader(“/Users/folder1/test.py”), context); 在我的python script有几个模块import语句,当我运行Java代码时,我得到错误为javax.script.ScriptException: ImportError: No module named psycopg2 。 所有模块都安装在我的机器上,当我通过CLI正常运行python script它会执行。 所以我的理解是Jython classpath正在寻找python模块的其他地方。 我如何检查Jython ScriptEngine在哪里查找模块然后修改它包括我的python模块实际存在的位置? 我是新手,所以请原谅任何缺乏理解。 注意:我的机器上安装了CentOS和python 2.7.5

使用Rhino而不是ScriptEngine在Java中运行Javascript代码

基于讨论将未知日期格式的字符串表示转换为Java中的Date ,我想在我的App-Engine项目中使用JavaScript Date函数。 但是,ScriptEngine不适用于App-Engine。 所以我需要一点帮助才能转换成Rhino。 这是我需要转换的ScriptEngine代码: ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine engine = scriptEngineManager.getEngineByName(“JavaScript”); String script = “var date = new Date(‘” + dateInUnknownFormat + “‘); var timestamp = date.getTime();”; engine.eval(script); long timestamp = ((Double) engine.get(“timestamp”)).longValue(); 以下没有奏效 private static long parseDateUsingRhino(String dateInUnknownFormat){ Context mozillaJsContext = Context.enter(); Scriptable scope = mozillaJsContext.initStandardObjects(); String script = “var […]

JVM缺少Rhino

我有一个使用ScriptEngine处理一些javascript的项目,并且在我的机器上运行良好,但是当我将项目的jar发送到服务器时,我发现服务器的JVM没有内置的Rhino,当时返回null代码调用了一个 new ScriptEngineManager().getEngineByName(“javascript”); 我去了rhino的下载页面,获取了最新的版本,并从中提取了js.jar,在项目中添加了jar,但仍然有同样的问题。

克隆整个JavaScript ScriptEngine

我需要以某种方式深度克隆我的ScriptEngine对象的整个绑定集。 我试过的 到目前为止,我已经尝试克隆整个Bindings结构的Cloner库 。 如果它有用,那将是很好的,因为它可以确保精确的副本,包括私有变量。 但是这会导致jvm堆损坏(jvm只是崩溃,退出代码为-1073740940)。 有时它不会崩溃,但会发生奇怪的事情,比如System.out.println()停止工作…… 我还研究了使用ScriptEngine中的js代码克隆对象,这样我就可以将它们作为NativeObjects获取并在一些java地图中管理它们。 但是我发现的所有克隆方法都存在缺陷。 我想要一个精确的对象快照。 例如,如果两个对象a和b中的每一个都包含引用相同对象c的字段(例如a.fa和b.fb),则在使用jQuery.extend() (例如)克隆字段a.fa和b.fb克隆的a和b将引用c的不同克隆,而不是引用一个相同的克隆。 还有很多其他边缘问题。 我还尝试使用Cloner克隆整个ScriptEngine(不仅仅是绑定),我还尝试使用Rhino的js引擎并克隆整个范围(而不是Bundeled ScriptEngine包装器)。 但堆腐败问题仍然存在。 为什么我需要这样做 我需要这个,因为我必须能够将整个ScriptEngine绑定的值恢复到之前的某个点。 我需要制作绑定的精确快照。 该应用程序是我的博士研究项目的一部分,该项目包括运行状态机和节点(在java中实现),其中附带了js代码。 js代码由最终用户输入,并且在运行时被逐出。 当无法通过路径到达最终状态时,算法会向后执行步骤,尝试查找备用路径。 在每个步骤向后,它必须撤消js引擎绑定中可能发生的任何更改。 所有全局变量名称在js evaling之前都是已知的,并且是对象(用户在节点的代码中键入,然后将其组织(在java中)到具有特定名称模式的js对象中)。 但是它们的内容可以是任何东西,因为它是由用户js代码控制的。 所以我想我现在唯一的解决方法是使用js代码克隆js对象。

使用Java ScriptEngine(Groovy),如何使其更高效?

我在我的应用程序中使用ScriptEngine来评估我的应用程序中的一些客户端代码。 问题是它不够高效,我需要采取措施来改善执行时间。 目前,最多可能需要1463毫秒(平均约300毫秒)来评估一个非常简单的脚本,这个脚本基本上是URL中的参数替换。 我正在寻找简单的策略来提高性能,而不会失去脚本编写能力。 我首先想到它汇集ScriptEngine对象并重用它。 我在规范中看到它意味着可以重复使用,但我没有找到任何实际做过的人的例子。 有任何想法吗? 这是我的代码: ScriptEngineManager factory = new ScriptEngineManager(); GroovyScriptEngineImpl engine = (GroovyScriptEngineImpl)factory.getEngineByName(“groovy”); engine.put(“state”, state; engine.put(“zipcode”, zip); engine.put(“url”, locationAwareAd.getLocationData().getGeneratedUrl()); url = (String) engine.eval(urlGeneratorScript); 对于任何反馈,我们都表示感谢!