我不清楚在使用(Mozilla)Rhino时如何在Javascript和Java之间转换类型的规则。
关于String
的文档中有一些细节:
记住Java字符串和JavaScript非常重要 字符串不一样[...] Rhino在减少字符串方面提供了一些帮助 两种类型之间的差异。首先,您可以传递JavaScript 字符串到需要Java字符串和Rhino的Java方法 执行转换。我们实际上看到了这个功能 在前面的例子中调用java.lang.String构造函数。 如果,Rhino还使JavaScript方法可用于Java字符串 java.lang.String类尚未定义它们
但是其他人呢?如果我将javascript Number传递给期望int
的Java方法,double
(或Integer
或Double
)是否会转换?那么long
/ Long
呢? (它不适合Double
,因此不适合JS编号?
返回这些值的Java方法怎么样?
然后是Boolean
/ boolean
。 JS常量true
和false
是否转换为适当的Java值?我见过像
java.lang.Boolean.TRUE.booleanValue()
用于JS,所以至少有些人认为不是。
我查看过Mozilla Rhino文档,但是如果我错过了一些明显的内容,请指出。
答案 0 :(得分:5)
以下是将JavaScript类型转换为Java类型的方法:http://www-archive.mozilla.org/js/liveconnect/lc3_method_overloading.html#InvocationConversion。
试一试:
$ java -cp js.jar org.mozilla.javascript.tools.shell.Main
js> new java.lang.Integer(12345)
12345
js> new java.lang.Integer(12345) == 12345
true
js> new java.lang.Double(12345.12345)
12345.12345
js> new java.lang.Long(9223372036854775807)
js: Cannot convert 9223372036854776000 to java.lang.Long
js> 9223372036854775807
9223372036854776000
js> new java.lang.Long("9223372036854775807")
9223372036854775807
js> new java.lang.Long("-9223372036854775808")
-9223372036854775808
js> new java.lang.Boolean(true)
true
js> new java.lang.Boolean(true) == true
true
js> new java.lang.Boolean(true) == false
false
js> java.lang.Boolean.TRUE.booleanValue() == true
true
js> java.lang.Boolean.FALSE.booleanValue() == false
true
<强> UPD 强>
不幸的是,我找不到任何关于JavaScript-from-Java类型映射的文档。但是tutorial表明JavaScript对象作为Java Object
插入并从上下文中检索,实际上可以是Double
s,Boolean
s,Function
s (对于JavaScript函数;还实现Scriptable
)或Scriptable
s(对象)。
使用this code snippet可能会获得JavaScript-Java类型映射引用:
https://gist.github.com/1089320#file_java_script_java_type_mapping.textile
至于LiveConnect兼容性。如果你指的是这个脚注:
从JavaScript调用Java的能力首先被实现为 Netscape浏览器技术的一部分,名为LiveConnect。然而, 因为该技术还包括与浏览器的通信 插件,因为在Rhino中从Java调用JavaScript的方式是 完全不同,本文不会使用该术语。
我认为使用Java中的JavaScript与LiveConnect规范不同。使用JavaScript中的Java应该是相同的。
答案 1 :(得分:2)
实际上,即使进行“自动”转换,我也遇到了问题,最终转换为自己:
function javaToJavaScript(str)
{
len = str.length();
tmp = "";
for (var i=0; i<len; i++)
tmp += String.fromCharCode(str.charAt(i));
return tmp;
}
答案 2 :(得分:0)
这是通过在字符串未实现js字符串具有的所有插件(例如string.length!== string.length()的情况)下,由包装工厂为我完成工作来解决的
>可以通过以下方式在顶层进行设置:
context = Context.enter();
//This tells Rhino to convert String, Number, Boolean and Character into their JavaScript equivalents when returning from a Java function
context.getWrapFactory().setJavaPrimitiveWrap(false);
context.initStandardObjects();