我有这个 JavaScript 文件(Rhino 1.7R4)。
importPackage(java.io);
importPackage(java.lang);
importPackage(java.util);
var reader = new BufferedReader( new InputStreamReader(System['in']) );
var line = reader.readLine();
var tok = new java.util.StringTokenizer(line);
var A = Integer.parseInt(tok.nextToken());
var B = Integer.parseInt(tok.nextToken());
var C = Integer.parseInt(tok.nextToken());
// System.out.printf( "A=%d, B=%d, C=%d\n", A, B, C );
System.out.printf( "A=%f, B=%f, C=%f\n", A, B, C );
Run Code Online (Sandbox Code Playgroud)
当我首先取消评论时printf
- 我得到
A=Exception in thread "main" org.mozilla.javascript.WrappedException: Wrapped java.util.IllegalFormatConversionException: d != java.lang.Double
at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1754)
at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:148)
at org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:225)
at org.mozilla.javascript.optimizer.OptRuntime.callN(OptRuntime.java:52)
at test._c_script_0(Unknown Source)
at test.call(Unknown …
Run Code Online (Sandbox Code Playgroud) 我已经在一些浏览器中成功地使用我的代码与ANTLR javascript目标中的javascript库,但现在我想在服务器上使用Rhino,我遇到了一些麻烦.我有一些简单的java代码引用了Rhino 1.7R2版本的js-14.jar文件.
Context context = Context.enter();
Scriptable scope = context.initStandardObjects();
context.evaluateReader(scope, new FileReader("C:\\antlr3-all.js"), "antlr", 1, null);
Run Code Online (Sandbox Code Playgroud)
这失败EcmaError
的消息是:
TypeError: Cannot call property namespace in object [JavaPackage org.antlr].
It is not a function, it is "object". (antlr#259)
Run Code Online (Sandbox Code Playgroud)
它所指的javascript行是:
org.antlr.namespace("org.antlr.runtime.tree");
Run Code Online (Sandbox Code Playgroud)
这org.antlr.namespace
在文件的早期声明为函数,所以我不确定该怎么想.我也没有看到"命名空间"是javascript或Rhino中的保留字.
这是第org.antlr.namespace
56行的声明:
org.antlr.namespace = function() {
var a=arguments, o=null, i, j, d;
for (i=0; i<a.length; i=i+1) {
d=a[i].split(".");
o=org.antlr.global;
// ANTLR is implied, so it is ignored if it is included
for (j=0; j<d.length; …
Run Code Online (Sandbox Code Playgroud) 有人能为我提供一个如何使用Rhino的java适配器在java脚本中扩展java类的示例吗?
我正在玩Rhino,我已经成功使用了stdlib中的Java类,但没有使用我编译的Java代码.
例如,这工作正常:
print(new java.util.Date());
Run Code Online (Sandbox Code Playgroud)
但是使用NanoHTTPD(单个.java文件,没有名称空间,相同的文件夹),我根本就没有运气:
js> new Packages.NanoHTTPD()
js: "<stdin>", line 4: uncaught JavaScript runtime exception: TypeError: [JavaPackage NanoHTTPD] is not a function, it is object.
at <stdin>:4
Run Code Online (Sandbox Code Playgroud)
我确信这很简单.我错过了什么?
编辑:我发布它是这样的:
$ CLASSPATH=. java -jar rhino.jar
Run Code Online (Sandbox Code Playgroud)
或这个:
$ java -classpath . -jar rhino.jar
Run Code Online (Sandbox Code Playgroud)
或者我将NanoHTTPD.java移动到文件夹"./nano"中,添加package nano;
到文件顶部,编译它,然后替换为".".在上面的类路径分配中使用"nano".
无论我怎么做,从翻译中我看到:
js> java.lang.System.getProperty("java.class.path")
/Users/me/blah/rhino.jar
Run Code Online (Sandbox Code Playgroud) 我有一个使用ScriptEngine来处理一些javascript的项目,并且在我的机器上运行良好,但是当我将项目的jar发送到服务器时,我发现服务器的JVM没有内置的Rhino,当返回null时返回null代码调用了一个
new ScriptEngineManager().getEngineByName("javascript");
Run Code Online (Sandbox Code Playgroud)
我去了rhino的下载页面,获取了最新的版本,并从中提取了js.jar,在项目中添加了jar,但仍然有同样的问题.
我不能为我的生活弄清楚如何在Rhino下的javascript中导入javascript文件.基本上,我想做的就是导入"some file.js"并能够在那里使用范围内的东西.
我一直在试图弄乱Context.currenctContext(compileString和compileReader),但是我不明白如何获得适当的Scope并且我不断地使用以下代码获取异常"找不到对象的默认值":
Context.currentContext.compileString("print('something')", "whatever, 0, null).exec(Context.currentContext, null)
Run Code Online (Sandbox Code Playgroud)
如果我不能创建我可以在我的javascript程序中重用的模块,这似乎很愚蠢......任何人都知道如何解决这个问题?
我想和温莎一起做自动锁定,以便我可以做类似的事情
_controller = _autoMockingContainer.Create<MyControllerWithLoadsOfDepdencies>();
Run Code Online (Sandbox Code Playgroud)
在Ayende的 Rhino图书馆里曾经有一个Windsor自动模拟容器.但这似乎不再维持,所以依赖关系有点旧(它使用Castle Windsor 2,但我们需要引用2.5),因此导致dll地狱.
有没有可行的替代方案?我尝试从rhino测试中提取出相关的类,但是我可以处理的更多内容.
我正在使用Rhino来评估js表达式,方法是将所有可能的变量值放在作用域中并评估匿名函数.然而,表达式相当简单,我想只将表达式中使用的值放在表达式中.
代码示例:
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects(null);
// Build javascript anonymous function
String script = "(function () {" ;
for (String key : values.keySet()) {
ScriptableObject.putProperty(scope, key, values.get(key));
}
script += "return " + expression + ";})();";
Object result = cx.evaluateString(scope, script, "<cmd>", 1, null);
Run Code Online (Sandbox Code Playgroud)
我想从变量名称的表达式中获取所有标记.
例如,如果表达式是
(V1ND < 0 ? Math.abs(V1ND) : 0)
Run Code Online (Sandbox Code Playgroud)
它会回来V1ND
.
我有一些javascript文件,并使用Rhino的javascript解析器解析它.
但我无法得到评论.
我怎样才能得到评论?
这是我的代码的一部分.
运行此代码,"comment"变量为null.另外,在运行"astRoot.toSource();"时,它只显示javascript代码.没有评论.它消失了!
[java code]
public void parser() {
AstRoot astRoot = new Parser().parse(this.jsString, this.uri, 1);
List<AstNode> statList = astRoot.getStatements();
for(Iterator<AstNode> iter = statList.iterator(); iter.hasNext();) {
FunctionNode fNode = (FunctionNode)iter.next();
System.out.println("*** function Name : " + fNode.getName() + ", paramCount : " + fNode.getParamCount() + ", depth : " + fNode.depth());
AstNode bNode = fNode.getBody();
Block block = (Block)bNode;
visitBody(block);
}
System.out.println(astRoot.toSource());
SortedSet<Comment> comment = astRoot.getComments();
if(comment == null)
System.out.println("comment is null");
}
Run Code Online (Sandbox Code Playgroud) 刚升级到含有ant 1.9.2的eclipse luna,我的<script>
目标停止在这段代码中工作:
<script language="javascript"><![CDATA[
importPackage(java.net);
importPackage(java.io);
...
Run Code Online (Sandbox Code Playgroud)
错误信息:
javax.script.ScriptException: ReferenceError: "importPackage" is not defined in <eval> at line number 2
Run Code Online (Sandbox Code Playgroud) rhino ×10
java ×7
javascript ×5
adapter ×1
ant ×1
antlr ×1
automocking ×1
classpath ×1
comments ×1
eclipse ×1
parsing ×1
scriptengine ×1
scripting ×1
unit-testing ×1