Получение значений полей объекта JavaScript

1

Я использовал носорог для настройки некоторых приложений. Ниже приведен пример функции JavaScript, которая вызывается из Java:

        function() {
            var phone = this.telephoneNumber;
            phone = phone.replace(/[^+0-9]/g,"");
            if (phone.indexOf("+") == 0) {
                phone = "00" + phone.substring(1);
            }
            if (phone.indexOf("0041") == 0) {
                phone = "0" + phone.substring(4);
            }
            if (phone.indexOf("0") == 0) {
                phone = "0" + phone;
            }
            return {
                Name: this.sn + " " + this.givenName,
                firstName: this.givenName || "",
                lastName: this.sn || "",
                phone: phone,
                service: "",
                info: ""
            };
        }

Приложение java может затем получить значения возвращаемого объекта за все, что ему нужно.

Теперь, когда новичок является частью JVM, я бы хотел использовать API скриптов вместо Rhino API, но я не нашел, как получить значения полей объекта JavaScript из Java-кода.

  • 0
    Rhino не является частью JVM; это часть времени выполнения. Это похоже на то, как Java просто использует исправленную версию Xalan для XSLT. Вы не получите каких-либо существенных улучшений в производительности, если они сильно не оптимизировали версию Rhino во время выполнения, но не смогли внести оптимизацию обратно в Rhino. Более того, вы получаете старую версию Rhino.
  • 0
    @DavidEhrmann Да, цель состоит не в том, чтобы повысить производительность, а в том, чтобы использовать стандартный API обработчика сценариев, чтобы было проще переключиться на другой язык сценариев.
Теги:
scriptengine
rhino

1 ответ

1
Лучший ответ

Это свободно связывает язык сценариев, но с оговорками, что функции должны быть названы, а возвращаемый объект должен быть Map (Rhino делает это, но я не уверен в JRuby).

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.eval("function x() { return { foo: 10 } }");

    Object o = ((Invocable)engine).invokeFunction("x");
    if (o instanceof Map) {
    Map m = (Map<Object, Object>)o;
        System.out.println(m.get("foo"));
    }

или

    CompiledScript script = ((Compilable)engine).compile("(function() { return {bar:20} })()");
    System.err.println(((Map)script.eval()).get("bar"));

Но вы должны обмануть и вызвать свою функцию, заполнив ее с помощью (...)().

  • 1
    Справедливо. Хотя он работает только с 1.7+ ... Думаю, пора перестать поддерживать более старые версии ... Забавная деталь: 1.7 возвращает Double, а 1.8 возвращает Integer.
  • 0
    Вы должны быть в состоянии запустить его в Java 6, если найдете нужный JSR JAR. Я помню, что мне приходилось делать это с StAX и Java 5. Интересная находка с двойным. Числа Javascript технически все удваиваются, поэтому я думаю, что это имеет смысл. Когда вы печатаете check, обязательно используйте Number, затем intValue ().
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню