在Java和(Rhino)Javascript之间传递常见类型

时间:2011-07-18 07:57:56

标签: java javascript type-conversion rhino

我不清楚在使用(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(或IntegerDouble)是否会转换?那么long / Long呢? (它不适合Double,因此不适合JS编号?

返回这些值的Java方法怎么样?

然后是Boolean / boolean。 JS常量truefalse是否转换为适当的Java值?我见过像

这样的代码
java.lang.Boolean.TRUE.booleanValue()

用于JS,所以至少有些人认为不是。

我查看过Mozilla Rhino文档,但是如果我错过了一些明显的内容,请指出。

3 个答案:

答案 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();