我正在尝试将复杂的Java小程序转换为JavaScript。 applet在TCP套接字上进行通信时会做各种各样的魔术,我需要在JavaScript中进行模拟。 TCP魔术本身非常复杂,所以我宁愿稍后再这样做,让applet的图形部分首先运行。通过TCP套接字的通信告诉applet要绘制什么,因此根据套接字上的数据,applet将读/写不同的值。
我目前的攻击计划是:
我被困在最后一部分。如果我返回一个字节数组,我怎么能将它转换为byte []或类似的?值是传回一个正确的Java数组还是某种对象哈希?
爪哇:
void callJavaScript(Applet app) {
String[] params = {"blah", "cool"};
JSObject win = JSObject.getWindow(app);
Object ret = win.call("someFunction", params);
// what is ret?
}
JavaScript的:
function someFunction (blah, cool) {
return [5, 7, 12, 2];
}
注意:
复杂的Java applet是多线程的,所以只需在applet中调用一些函数就不重要了。
答案 0 :(得分:2)
只写了一个样本来检查=)
Test.java:
import java.applet.Applet;
import java.awt.*;
import netscape.javascript.JSObject;
public class Test extends Applet {
public void init() {
JSObject window = JSObject.getWindow(this); // this=applet
String[] params = {"blah", "cool"};
Object ret = window.call("testfunc", params);
if (ret instanceof JSObject){
JSObject jsret = (JSObject)ret;
Object len = jsret.getMember("length");
String val = "";
if (len instanceof Number){
val = "array: ";
int n = ((Number)len).intValue();
for (int i = 0; i < n; ++i){
val += jsret.getSlot(i).toString() + " ";
}
} else{
val = "no array: " + ret.toString();
}
String[] params2 = {val};
window.call("alert", params2);
} else{
String[] params2 = {ret.toString()};
window.call("alert", params2);
}
}
}
的test.html:
<html>
<head>
<title> Test </title>
<script language="JavaScript">
function testfunc(a, b){
return [1, 2];
}
</script>
</head>
<body>
<applet code="Test.class" archive="." width="500" height="200"><param name="codebase_lookup" value="false"></applet>
</body>
</html>
docstore.mik.ua/orelly/web/jscript/ch19_06.html中的转换显示有效(图19.5和19.6)。您可以在我的代码中看到我检查了len instanceof Number
而不是len instanceof Double
,因为在我的IE中它返回了Integer
。