JSObject- передаются ли массивы JavaScript как массивы Java?

#java #javascript #casting

#java #javascript #Кастинг

Вопрос:

Я пытаюсь преобразовать сложный Java-апплет в JavaScript. Апплет выполняет всевозможные магические действия при обмене данными через сокет TCP, который мне нужно будет эмулировать в JavaScript. Магия TCP сама по себе довольно сложная, поэтому я предпочел бы сделать это позже и сначала запустить графическую часть апплета. Связь через сокет TCP сообщает апплету, что рисовать, поэтому в зависимости от данных в сокете апплет будет считывать / записывать разные значения.

Мой текущий план атаки:

  • Передайте заголовок запроса в JavaScript в качестве параметров (рабочих), а также необходимые данные из сокета в зависимости от типа запроса
  • Проанализируйте параметры заголовка / данные, отправленные в JS, и создайте объекты соответствующим образом
  • Возвращает значение вызывающей функции Java с массивом байтов, которые должны быть записаны в сокет TCP

Я застрял на последней части. Если я возвращаю массив байтов, как я могу преобразовать его в byte[] или аналогичный? Передается ли значение обратно в надлежащий массив Java или это какой-то хэш объекта?

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-апплет является многопоточным, поэтому простой вызов некоторой функции в апплете нетривиален.

Комментарии:

1. Из docstore.mik.ua/orelly/web/jscript/ch19_06.html Я бы предположил ret , что это должен быть netscape.javascript. JSObject. Если это массив в javascript, вы пытались использовать ret.getSlot ?

Ответ №1:

Только что написал образец для проверки =)

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 он вернул an Integer .