在Java和(Rhino) Javascript之间传递公共类型

Passing common types between Java and (Rhino) Javascript

本文关键字:类型 之间 Javascript Java Rhino      更新时间:2023-09-26

我不清楚使用(Mozilla) Rhino时如何在Javascript和Java之间转换类型的规则。

文档中有一些关于String的细节:

重要的是要记住Java字符串和JavaScript字符串不一样[…]Rhino提供了一些帮助来减少两种类型的区别。首先,您可以传递一个JavaScript将字符串转换为Java方法,该方法需要Java字符串,Rhino将这样做执行转换。我们实际上在在前面的例子中调用java.lang.String构造函数。Rhino还使Java字符串可以使用JavaScript方法string类还没有定义它们

但是其他人呢?如果我传递一个javascript数字到一个Java方法期待int, double(或IntegerDouble)会得到转换吗?long/Long呢?(这将不适合在Double,所以不会适合在JS号码?

返回这些值的Java方法呢?

然后是Boolean/boolean。JS常数truefalse转换为和从适当的Java值?我看到过像

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

从JS中使用,所以至少有些人认为它不是。

我已经看了Mozilla Rhino文档,但如果我错过了一些明显的东西,请指出。

如何将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

乌利希期刊指南

不幸的是,我找不到任何关于JavaScript-from-Java类型映射的文档。但是本教程展示了JavaScript对象作为Java Object s插入上下文并从上下文检索,实际上可以是Double s, Boolean s, Function s(用于JavaScript函数;也实现了Scriptable)或Scriptable s(对象)。

使用这个代码片段可以得到JavaScript-Java类型映射引用:

https://gist.github.com/1089320 file_java_script_java_type_mapping.textile

至于LiveConnect的兼容性。如果你指的是这个脚注:

从JavaScript调用Java的能力最初实现为这是网景浏览器技术LiveConnect的一部分。然而,因为这项技术也包含了与浏览器的通信插件,因为在Rhino中从Java调用JavaScript的方式是完全不同,这一术语将不会在本文中使用。

我认为这是关于从Java中使用JavaScript与LiveConnect规范不同。从JavaScript使用Java应该是一样的

实际上,即使是"自动"转换,我也有一个问题,最终我自己转换:

function javaToJavaScript(str)
{
    len = str.length();
    tmp = "";
    for (var i=0; i<len; i++)
        tmp += String.fromCharCode(str.charAt(i));
    return tmp;
}

在字符串没有实现js字符串所具有的所有附加组件的情况下,通过包装工厂为我完成工作解决了这个问题。== 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();