是否有任何关于使用java方法调用rhino-javascript函数并将其返回给java的示例?我发现rhino的唯一例子是只在rhino shell上输入命令.
我在javax.scripting地图实现中看到了一些奇怪的行为.
在线示例显示了在js环境中添加到列表的示例:
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
List<String> namesList = new ArrayList<String>();
namesList.add("Jill");
namesList.add("Bob");
namesList.add("Laureen");
namesList.add("Ed");
jsEngine.put("namesListKey", namesList);
System.out.println("Executing in script environment...");
try
{
jsEngine.eval("var names = namesListKey.toArray();" + "for(x in names) {" + " println(names[x]);" + "}"
+ "namesListKey.add(\"Dana\");");
} catch (ScriptException ex)
{
ex.printStackTrace();
}
System.out.println(namesList);
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试使用地图执行类似操作,则会看到奇怪的行为.首先,如果您尝试迭代地图键,例如
HashMap<String, Object> m = new HashMap<String, Object>();
jsEngine.put("map", m);
Run Code Online (Sandbox Code Playgroud)
无法获取地图密钥 - 如果您尝试迭代密钥,则会获得方法名称 -
jsEngine.eval(" for (var k in m.keySet()){ println(k)};");
Run Code Online (Sandbox Code Playgroud)
结果是 :
notifyAll
removeAll
containsAll …Run Code Online (Sandbox Code Playgroud) 我在Java7中遇到Rhino javascript引擎的性能问题,很快 - 我的脚本(解析和编译文本)在Chrome中运行的速度比Java7 Rhino脚本引擎快50到100倍.
我试图找到改善情况的方法,并发现Rhino支持编译脚本.我尝试用我的脚本做这件事,实际上没有看到任何改进.最后 - 我最终得到了一个虚拟的短测试套件,我认为编译版和解释版之间的性能没有任何差别.请让我知道我做错了什么.
注意:有些消息来源提到Rhino引擎运行编译脚本比直接用Java编写的"相同"代码慢大约1.6.不确定此示例中使用的"脚本编译"是否与假设相同.
测试java类如下,我在我的机器上得到的样本结果......
结果
Running via com.sun.script.javascript.RhinoScriptEngine@c50443 ...
time: 886ms, chars: 38890, sum: 2046720
time: 760ms, chars: 38890, sum: 2046720
time: 725ms, chars: 38890, sum: 2046720
time: 765ms, chars: 38890, sum: 2046720
time: 742ms, chars: 38890, sum: 2046720
... 3918ms
Running via com.sun.script.javascript.RhinoCompiledScript@b5c292 @ com.sun.script.javascript.RhinoScriptEngine@f92ab0 ...
time: 813ms, chars: 38890, sum: 2046720
time: 805ms, chars: 38890, sum: 2046720
time: 812ms, chars: 38890, sum: 2046720
time: 834ms, chars: 38890, sum: 2046720
time: 807ms, chars: … 这是我的情况:
我可以访问Java类中的Rhino Context对象.我想阅读一堆.js文件并将它们传递给Rhino上下文以对它们进行评估.我真的不想在脚本上下文中使用.js文件中的函数,因为我只是在.js文件中声明的变量可用(这是工具验证的一种问题).
理想情况下,我会读入并尝试一次评估每个文件,而不是逐行.我注意到在Context中有一个方法(参见Rhino API)evaluateReader().我的第一个猜测是我应该获取我想要加载的所有文件,仔细检查它们,并调用此方法为每个文件传递某种读取器对象,而且非常好,现在它们都在我的脚本环境中.
因此,假设我在那里正确的轨道,有人可以告诉我在Java脚本环境中使用.js文件是否有任何良好的做法,或者如果有更好的方法,或者你做了一些其他方式等?
这里没有查找实现细节,只是来自其他人的反馈,这可能已经在他们的一些代码中完成了.使用Java编写脚本语言对我来说是新的.
我正在使用tomcat服务器,我已经添加了一个rhino引擎,以便能够为我的用户提供一些脚本功能.第二阶段是提供一些调试环境.
我知道rhino有一个调试API,但我找不到任何关于如何使用它的文档/代码示例,并围绕它构建一个调试器
有谁知道?
基本上我正在尝试将javaScript函数传递给Java方法以充当脚本的回调.
我可以做到 - 有点 - 但我收到的对象是sun.org.mozilla.javascript.internal.InterpretedFunction,我没有看到调用它的方法.
有任何想法吗?
这是我到目前为止所拥有的:
var someNumber = 0;
function start() {
// log is just an log4j instance added to the Bindings
log.info("started....");
someNumber = 20;
// Test is a unit test object with this method on it (taking Object as a param).
test.callFromRhino(junk);
}
function junk() {
log.info("called back " + someNumber);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Mozilla Rhino JavaScript模拟器.它允许我将Java方法添加到上下文中,然后将它们称为JavaScript函数.但除非我使用静态方法,否则我无法工作.
问题是这部分文档:
如果方法不是静态的,那么Java'this'值将对应于JavaScript'this'值.任何使用不具有正确Java类型的'this'值调用该函数的尝试都将导致错误.
显然,我的Java"this"值与JavaScript中的值不对应,我不知道如何使它们对应.最后,我想在Java中创建一个实例,并在全局范围内安装几个方法,因此我可以从Java初始化实例,但在我的脚本中使用它.
有没有人有一些示例代码?
我如何使用Rhino从Java返回一个字符串到Javascript,我得到的就是org.mozilla.javascript.JavaNativeObject我使用的时候
var jsString = new java.lang.String("test");
Run Code Online (Sandbox Code Playgroud)
在我的js文件中.
这是正确的方法吗?
var jsString = String(new java.lang.String("test"));
Run Code Online (Sandbox Code Playgroud)
目标是使用Java方法返回String对象,而不是像上面那样动态创建它.
我正在使用java来运行用Rhino编写的命令行实用程序,但如果有错误,我需要将该错误返回给shell,以便处理停止.如何将错误代码从Rhino传回shell?
我正在尝试让require.js在服务器端使用Java 6和Rhino加载模块.
我能够自己加载require.js就好了.犀牛可以看到这个require()功能.我可以说,因为Rhino抱怨说当我换成其他require()东西时它找不到这个功能requireffdkj().
但是当我试图要求一个简单的JS时,就像 hello.js
var hello = 'hello';
Run Code Online (Sandbox Code Playgroud)
使用以下任一方法:
require('hello');
require('./hello');
Run Code Online (Sandbox Code Playgroud)
它不起作用.我明白了
Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.JavaScriptException: [object Error] (<Unknown source>#31) in <Unknown source> 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)
Run Code Online (Sandbox Code Playgroud)
我把我hello.js放在Java类路径的顶部.那也是我的地方require.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.)在任何一种情况下我都会收到错误:
Caused by: javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "arguments" is not defined. (<Unknown source>#19) in <Unknown source> at line number …Run Code Online (Sandbox Code Playgroud) rhino ×10
java ×8
javascript ×8
debugging ×1
java-7 ×1
method-call ×1
open-source ×1
require ×1
requirejs ×1
string ×1