Передача общих типов между Java и (Rhino) Javascript - PullRequest
8 голосов
/ 18 июля 2011

Мне неясно, как преобразовывать типы между Javascript и Java при использовании (Mozilla) Rhino.

В документации есть некоторые подробности о String:

Важно помнить, что строки Java и JavaScript строки не совпадают […] Rhino предоставляет некоторую помощь в сокращении различия между двумя типами. Во-первых, вы можете передать JavaScript строка в метод Java, который требует строку Java и Rhino будет выполнить преобразование. Мы на самом деле видели эту функцию в действии на вызов конструктора java.lang.String в предыдущем примере. Rhino также делает методы JavaScript доступными для строк Java, если класс java.lang.String их еще не определяет

Но как насчет других? Если я передам javascript Number методу Java, ожидающему int, double (или Integer или Double), будет ли он преобразован? А как насчет long / Long? (который не вписывается в Double и поэтому не вписывается в номер JS?

А как насчет методов Java, возвращающих эти значения?

Тогда есть Boolean / boolean. Констант JS true и false преобразованы в соответствующее значение Java? Я видел код вроде

java.lang.Boolean.TRUE.booleanValue()

используется из JS, поэтому, по крайней мере, некоторые люди думают, что это не так.

Я посмотрел документацию по Mozilla Rhino, но все же указал, что пропустил что-то очевидное.

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Вот как он преобразует типы JavaScript в типы Java: http://www -archive.mozilla.org / js / liveconnect / lc3_method_overloading.html # InvocationConversion .

Попробуйте:

$ java -cp js.jar org.mozilla.javascript.tools.shell.Main

js> new java.lang.Integer(12345)
12345
js> new java.lang.Integer(12345) == 12345
true

js> new java.lang.Double(12345.12345)
12345.12345

js> new java.lang.Long(9223372036854775807)                 
js: Cannot convert 9223372036854776000 to java.lang.Long
js> 9223372036854775807
9223372036854776000
js> new java.lang.Long("9223372036854775807")
9223372036854775807
js> new java.lang.Long("-9223372036854775808")
-9223372036854775808

js> new java.lang.Boolean(true)
true
js> new java.lang.Boolean(true) == true
true
js> new java.lang.Boolean(true) == false
false
js> java.lang.Boolean.TRUE.booleanValue() == true
true
js> java.lang.Boolean.FALSE.booleanValue() == false
true

UPD

К сожалению, я также не могу найти никаких документов о сопоставлении типов JavaScript-из-Java.Но учебник показывает, что объекты JavaScript вставляются и извлекаются из контекста как Java Object s, которые на самом деле могут быть Double s, Boolean s, Function s (для функций JavaScript; такжереализует Scriptable) или Scriptable s (для объектов).

Используя этот фрагмент кода возможно получить ссылку на отображение типа JavaScript-Java:

https://gist.github.com/1089320#file_java_script_java_type_mapping.textile

Что касается совместимости с LiveConnect.Если вы ссылаетесь на эту сноску:

Возможность вызова Java из JavaScript была впервые реализована как часть технологии браузера Netscape под названием LiveConnect.Однако, поскольку эта технология также включает в себя связь с плагинами браузера, и поскольку способ вызова JavaScript из Java в Rhino совершенно другой, этот термин не будет использоваться в этой статье.

Я думаю, что этоиспользование JavaScript из Java отличается от спецификации LiveConnect.Использование Java из JavaScript должно быть таким же.

2 голосов
/ 05 августа 2013

На самом деле у меня была проблема даже с «автоматическим» преобразованием, в результате чего я сам преобразовал:

function javaToJavaScript(str)
{
    len = str.length();
    tmp = "";
    for (var i=0; i<len; i++)
        tmp += String.fromCharCode(str.charAt(i));
    return tmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...