Метод вызова Nashorn объекта java (переданный через привязки) через ссылку на функцию в JS

Я хотел бы поместить собственные объекты Java в привязки ScriptEngine для облегчения доступа.

scriptEngine.put("myApi", myApiInstance);

Здесь myApiInstance имеет один нестатический метод foo ().

Теперь в JS у меня есть функция:

someJsFunction(func) { func.call(...) }

Но звонок

someJsFunction(myApiInstance.foo)

приводит к ошибке «TypeError: func.call не является функцией».

С другой стороны, myApiInstance.foo () работает, как ожидалось. Это похоже на специфику ScripEngine, поскольку метод call () должен быть доступен в любой функции. И да, "typeof myApiInstance.foo" возвращает "function"

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
987
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Методы Java и объекты интерфейса функций (лямбда-объекты) рассматриваются как функции сценария и, следовательно, могут быть вызваны из JavaScript, как обычно. Как вы упомянули, "typeof" для таких объектов возвращает true. Вы можете вызвать их напрямую из скрипта. Но это не настоящие объекты функций JS в том смысле, что у них нет своего прототипа Function.prototype. Тем не менее, если вы хотите вызвать их с помощью Function.prototype.call или .apply [скажем, вы отправляете на любой переданный вызываемый объект), вы можете сделать следующее:

import javax.script.*;

public class Main {
  public static void main(String[] args) throws Exception {
    ScriptEngineManager m = new ScriptEngineManager();
    ScriptEngine e = m.getEngineByName("nashorn");

    // get the java static method to call
    e.eval("var getProp = java.lang.System.getProperty");
    // direct call
    e.eval("print(getProp('java.home'))");

    // call using Function.prototype.call
    e.eval("print(Function.prototype.call.call(getProp, null, 'java.home'))");

    // a java object
    e.eval("var out = java.lang.System.out");
    // get an instance method
    e.eval("var p = out.println");
    // call java instance method using Function.prototype.call
    e.eval("Function.prototype.call.call(p, out, 'hello world')");
  }
}

Другие вопросы по теме