最好参考章节:«19.3 LiveConnect 数据转换»。
传入的每个对象jsArgs
都使用JavaObject wrapper进行包装。事实上,它是同一个 JavaScript 对象,具有可用的底层对象的所有公共属性和方法。
例如,如果我有以下 Java 类:
public class MyJavaClass {
public String name;
public int number;
public MyJavaClass(String n, int i) {
name = n;
number = num;
}
}
并调用 JavaScript 函数:
JSObject.getWindow(MyApplet.this).call("abFunc", new MyJavaClass("Kolya", 500));
JavaScript 函数可能如下所示:
var abFunc = function(obj){
numberPlusThousand = (1000 + obj.number);
name = String(obj.name);
...
};
如果需要,您可以像任何其他 JavaScript 对象一样将其转换为 JSON 字符串。
作为参数传递给call
函数的 JSObject 类的实例将被转换为相应的 JavaScript 对象。所以,如果你想避免在你的 JavaScript 代码中出现 JavaObject 实例,你可以尝试像这样创建新的 JSObject 实例:
JSObject myJsObj = (JSObject) JSObject.eval("{}");
并添加新属性:
myJsObj.setMember("name", JSObject.eval("'Kolya'"));
myJsObj.setMember("number", 500);
或者像这样:
myJsObj.eval("self.name = 'Kolya'");
myJsObj.eval("self.number = 500");
在我看来,将 Java 中的 JavaScript 对象表示为映射会更方便,使用Gson之类的库将它们作为 JSON 字符串传递给 JavaScript,然后使用JSON.parse()将它们转换为 JavaScript 对象。
看看这个 Gson 的用法:
Map m1 = ImmutableMap.of("id", "Kolya", "num", 500);
Map m2 = ImmutableMap.of("marks", new byte[] {5, 4, 5, 3});
Map m = ImmutableMap.of("m1", m1, "m2", m2, "l", ImmutableList.of("str", 234L, false));
System.out.println(new Gson().toJson(m));
// {"m1":{"id":"Kolya","num":500},"m2":{"marks":[5,4,5,3]},"l":["str",234,false]}
ImmutableMap
并且ImmutableList
来自番石榴图书馆。