在Java和(Rhino) Javascript之间传递公共类型
Passing common types between Java and (Rhino) Javascript
我不清楚使用(Mozilla) Rhino时如何在Javascript和Java之间转换类型的规则。
文档中有一些关于String
的细节:
重要的是要记住Java字符串和JavaScript字符串不一样[…]Rhino提供了一些帮助来减少两种类型的区别。首先,您可以传递一个JavaScript将字符串转换为Java方法,该方法需要Java字符串,Rhino将这样做执行转换。我们实际上在在前面的例子中调用java.lang.String构造函数。Rhino还使Java字符串可以使用JavaScript方法string类还没有定义它们
但是其他人呢?如果我传递一个javascript数字到一个Java方法期待int
, double
(或Integer
或Double
)会得到转换吗?long
/Long
呢?(这将不适合在Double
,所以不会适合在JS号码?
返回这些值的Java方法呢?
然后是Boolean
/boolean
。JS常数true
和false
转换为和从适当的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();
- Javascript 类型未定义和 void 之间的区别
- 在 JavaScript 中单击函数时两个日期类型输入之间的差异的代码
- 这些函数类型之间有什么区别
- 如何在面板中添加在两种类型的谷歌图表之间切换的按钮
- JS和iOS之间的类型安全
- JS:未定义值和未定义类型,以及null值和null类型之间的区别
- 数据类型 jsonp 和 JSON 之间的区别
- 如何在角度js中计算2种HTML5时间输入类型之间的差异
- 在所有系列类型之间共享工具提示
- 环聊类型之间的差异
- 两种 JavaScript 对象类型之间的差异
- 在Angular模型中,可以在JSON对象和字符串之间切换值类型吗
- 在javascript中的类型之间转换
- JS全局变量类型之间的差异
- 带类型的<脚本>标记和不带类型的<脚本>之间的区别
- 输入类型之间的 DOM/jQuery 事件传播差异
- 删除谷歌位置类型之间的逗号
- “脚本类型”和“脚本语言”声明之间的区别
- 当拖动一个小元素时,是否有可能避免在CSS光标类型之间改变?
- 在Javascript原型继承中,数组和数字数据类型之间有区别吗