#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
.