взаимодействие между Rhino и Java через JSR223: работа с экземплярами Javascript Object - PullRequest
1 голос
/ 08 апреля 2011

Это очень похоже на этот другой SO вопрос о массивах .

Если я оцениваю:

y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"}

в сценарии Javascript, созданном с помощью JSR223 (ScriptingEngine)Я получаю NativeObject некоторого вида (я вижу это в отладчике Eclipse) и не знаю, как получить доступ к его свойствам.Более того, я даже не знаю, какой файл .jar, если таковой имеется, мне нужно добавить в путь сборки, чтобы иметь возможность работать с соответствующим классом, и если я найду подход, который работает в Rhino Javascript, он бесполезен дляJython.

Похоже, JSR223 должен был включать независимые от языка методы доступа к ScriptingEngine, чтобы обеспечить возможность переносить возвращаемый объект как List<Object> для массивов или Map<String, Object> для ассоциативных массивов.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

Преобразуйте его в объект Java и верните его.Затем вы можете работать с Java-объектом, как обычно.

Ниже приведен пример функции преобразования

function convertToJava(o) {
    var rval;
    if (Array.isArray(o)) {
        rval = new java.util.ArrayList();
        for (var key in o) {
            rval.add(convertToJava(o[key]));
        }
    } 
    else if (typeof o === 'object') {
        rval = new java.util.HashMap();
        for (var key in o) {
            rval.put(key, convertToJava(o[key]));
        }
    }
    else if (typeof o === 'function') {
        // skip
    }
    else if (typeof o === 'undefined') {
        // skip
    }
    else {
        rval = o;
    }
    return rval;
}
0 голосов
/ 01 августа 2011

Я тоже пытаюсь встраивать разные языки сценариев с большим количеством функций, чем jsr223 или bsf.Для этого мне пришлось определить свои собственные интерфейсы и реализовать их вокруг каждого отдельного механизма сценариев.

Одна особенность, которую я хотел, была возможность передавать функцию (интерфейс Java с одним методом) моему механизму сценариев и иметьэто просто работает, когда передаются параметры.У каждого из моих встроенных скриптовых движков есть слой, где я обертываю / разворачиваю из / в java-значения из среды сценариев.

Я бы предложил лучший способ решить эту проблему, если бы ваша оболочка вокруг механизма сценариев предоставлялаgetValue (String name) и он исправляет массивы javascript, преобразуя их в списки java.Естественно, setValue (String, Object) проверит, является ли значение списком, и преобразует его обратно в массив js и так далее.Это утомительно: ()

...