JSObject- JavaScript数组是否作为Java数组传递?

时间:2011-10-26 16:52:06

标签: java javascript casting

我正在尝试将复杂的Java小程序转换为JavaScript。 applet在TCP套接字上进行通信时会做各种各样的魔术,我需要在JavaScript中进行模拟。 TCP魔术本身非常复杂,所以我宁愿稍后再这样做,让applet的图形部分首先运行。通过TCP套接字的通信告诉applet要绘制什么,因此根据套接字上的数据,applet将读/写不同的值。

我目前的攻击计划是:

  • 根据请求类型
  • 将请求标头作为参数(工作)传递给JavaScript以及来自套接字的所需数据
  • 解析JS中发送的头部参数/数据并相应地创建对象
  • 返回值以调用Java函数,其中包含要写入TCP套接字的字节数组

我被困在最后一部分。如果我返回一个字节数组,我怎么能将它转换为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中调用一些函数就不重要了。

1 个答案:

答案 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