Tag: rhino

尝试使用Rhino,getEngineByName(“JavaScript”)在OpenJDK 7中返回null

当我运行下面的代码时,当我使用OpenJDK 7( java-7-openjdk-i386 )时, engine变量被设置为null 。 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class TestRhino { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName(“JavaScript”); try { System.out.println(engine.eval(“1+1”)); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); […]

克隆整个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模拟鸭子打字

问题:我希望能够在Java中一般性地访问Java ojbect上的任何属性/字段,类似于动态语言(想想Groovy,JavaScript)的方式。 我不知道当时我正在编写这个管道代码它是什么类型的对象或属性/字段名称是什么。 但是当我去使用它时我会知道属性/字段名称。 我目前的解决方案:到目前为止,我已经编写了一个简单的包装类,它使用java.beans.Introspector来获取Bean / POJO的属性并将它们公开为Map 。 它很粗糙但适用于简单的情况。 我的问题是除了reflection/转换为Map之外还有哪些方法可以解决这个问题? 在我走得太远之前,我想知道是否有人知道我如何能够从Rhino或javax.script.*蚕食一些东西javax.script.*这个概念已经过深思熟虑。 或者也许是一种我没有考虑过的完全不同的方法。 编辑:是的我熟悉reflection(我相信Introspector无论如何都在使用它)。 如果有任何其他经过深思熟虑的解决方案,我只是好奇。 编辑2:似乎最流行的答案涉及1)直接或通过辅助类进行reflection,和/或2)映射到实现所需类成员的接口。 关于利用Groovy的评论,我真的很感兴趣。 由于Groovy具有真正的duck-typing并且它是一种JVM语言,有没有办法在Groovy中创建一个简单的帮助器并从Java调用它? 这将非常酷,可能更灵活,性能更好。 答:我认为迈克的答案是最好的,因为它是一个最接近的完整概念。 对于这种特殊情况,我可能不会采用这种方式,但它肯定是一种有用的方法。 任何看过这个的人都应该确保在这里阅读对话,因为那里有很多有用的信息。 谢谢!

使用require.js和Java / Rhino解析模块

我正在尝试让require.js在服务器端使用Java 6和Rhino加载模块。 我能够自己加载require.js就好了。 Rhino可以看到require()函数。 我可以告诉,因为当我将require()更改为requireffdkj()类的东西时,Rhino抱怨它无法找到该函数。 但是当我尝试甚至需要一个简单的JS时,比如hello.js var hello = ‘hello’; 使用以下任一方法: require(‘hello’); require(‘./hello’); 它不起作用。 我明白了 Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: [object Error] (#31) in at line number 31 at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:153) at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:167) at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247) 我在Java类路径的顶部有我的hello.js . 这也是我需要的地方require.js 。 我尝试将hello.js移动hello.js我认为可能发生的任何地方,包括我的硬盘驱动器的根目录,用户目录的根目录,运行Java应用程序的目录等等。没有任何作用。 我查看了CommonJS规范( http://wiki.commonjs.org/wiki/Modules/1.0 ),它说顶级ID(如hello )是从“概念模块名称空间根”解析的,而相对ID (如./hello )是针对调用模块解决的。 我不确定这些基线在哪里,我怀疑这是问题所在。 有什么建议么? 我甚至可以使用Rhino的require.js吗? 编辑:我认为我需要根据Pointy的建议在下面的评论中设置环境,我也尝试评估r.js (我在评估require.js之后尝试进行评估,然后在require.js之前再次进行require.js 。)在任何一种情况下我都会收到错误: Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: […]

我如何开始使用Oracle的Nashorn JS引擎进行编码?什么时候它会取代OpenJDK中的Rhino?

我正在寻找一种方法来开始使用Oracle的新Nashorn JavaScript引擎。 我已经DL了最新的OpenJDK 8(b65),看起来Rhino仍然是唯一包含的脚本引擎。 任何人都知道Nashorn何时(或在哪个版本中)将取代OpenJDK中的Rhino? 或者甚至更好,我可以在哪里获得包含它的JDK? 我知道Netbeans已经编写了一个调试器来使用它,只是不确定他们从哪里获得了库/代码来开始编写它。 有人有链接吗? 谢谢。

JavaScript(Rhino)使用库或包含其他脚本

在JDK6中,有没有办法加载多个脚本,每个脚本都在一个文件中,并让一个脚本引用另一个脚本的方法? 有点像“包括”?

从Java / Scala实例化Rhinoscript Native Objects

我正在尝试提高javascript片段评估程序的性能。 这些脚本片段可以引用存在于类似json的对象图(IE:Json AST)的字符串键控映射中的任意数量的变量。 我正在使用JDK 1.6和嵌入式Rhinoscript引擎(v1.6R2)。 目前,处理采用以下forms: 解析代码段以发现引用变量的名称 从地图中检索变量并将其序列化为json字符串 Json字符串被分配给脚本开头的类似命名的变量 评估增强的脚本 我试图找出如何跳过json序列化阶段并创建直接Rhinoscript本机对象放置在脚本的“绑定”中。 然后,所需的步骤是: 解析代码段以发现引用变量的名称 从地图中检索变量并将其转换为原生Rhinoscript等价物 本机对象放置在绑定中 用所述绑定评估原始脚本 你知道我在哪里可以找到如何实例化原生rhinoscript对象的文档或示例吗? 如果你想修补我的scala学习项目可能会有所帮助。 我想出的任何答案都应该出现在那里…… http://subversion.assembla.com/svn/freshcode_public/learn_scala/datastore/src/test/scala/pkg/script 提前致谢。

Nashorn创业缓慢可以克服吗?

我使用Rhino作为图形内部的脚本组件。 在该项目中,大约有200个小脚本独立运行。 启动应用程序时,脚本应立即全速运行。 Rhino的表现已经足够了,但自从Oracle建议迁移到Nashorn之后,我面临着一个困境。 下图显示了Rhino和Nashorn之间的负载差异,大约有15,000个脚本调用。 Nashorn的创业缓慢是我最大的问题。 注意,这是在JDK 1.8.0上。 JDK 1.8u5是类似的 我希望图片清晰。 这是我如何使用ScriptEngine的概述: 我正在使用One scripting Engine实例, 我为每个脚本创建一个CompiledScript对象, Swingworker执行一次CompiledScript.eval()。 每半秒SwingWorkers就会启动。 每个CompiledScript都有自己的SimpleScriptContext实例,可以在每次执行时重复使用。 下面我包含了一个运行时配置文件,说明了引擎随时间的繁忙程度; 有谁知道如何克服Nashorn的创业缓慢? 更新于2015年4月15日 在Java8u45上使用200个单独的脚本进行相同的测试。 性能要好得多! 在Java7上运行与Rhino类似。

如何在Java程序中调用Rhino编译的JavaScript方法(类文件)?

我将以下JavaScript文件“test.js”编译成“test.class”: var test = (function () { var that = {}; that.addNumbers = function (a, b) { return a+b; }; return that; }()); 我想在简单的Java程序“run.java”中调用已编译的JavaScript函数“test.addNumbers(1,2)”,如下所示: public class run { public static void main(String[] args) throws Exception { Context cx = Context.enter(); try { Scriptable scope = cx.initStandardObjects(); // HOW TO CALL THE METHOD, Test.addNumbers(1,2)? Please help […]

如何从JavaScript调用Java实例的方法?

我正在使用Mozilla Rhino JavaScript模拟器。 它允许我将Java方法添加到上下文中,然后将它们称为JavaScript函数。 但除非我使用静态方法,否则我无法工作。 问题是这部分文档: 如果该方法不是静态的,那么Java’this’值将对应于JavaScript’this’值。 任何使用不具有正确Java类型的’this’值调用该函数的尝试都将导致错误。 显然,我的Java“this”值与JavaScript中的值不对应,我不知道如何使它们对应。 最后,我想在Java中创建一个实例,并在全局范围内安装几个方法,因此我可以从Java初始化实例,但在我的脚本中使用它。 有没有人有一些示例代码?