У меня есть пользовательский функциональный интерфейсJava Nashorn магазин Функция
public interface ThingFunction {
Object apply(Thing thing, String... flags);
}
я в настоящее время есть способ их хранения для последующего использования
public class Thing {
private static Map<String, ThingFunction> functions = new HashMap<>();
...
public static void addFunction(String key, ThingFunction function) {
functions.put(key, function);
}
...
public Object executeFunction(String key, String... flags) {
return functions.get(key).accept(this, flags);
}
...
}
Я пытаюсь выставить эти функции через API JS (с использованием двигателя Nashorn). В принципе, я хочу, чтобы пользователь мог написать функцию javascript, такую как function(thing, flags) {...}
, и сохранить ее как функцию ThingFunction в карте функций.
Я знаю, что могу случае двигатель к Invocable
и использовать Invocable::getInteface(Class)
создать ThingFunction из яваскрипта кода
...
engine.eval("function apply(actor, flags) {return 'There are ' + flags.length + ' arguments';}");
Invocable invocable = (Invocable) enging;
ThingFunction function = invocable.getInterface(ThingFunction.class);
function.apply(thing, "this", "is", "a", "test");
...
Однако этот подход означает, что я могу иметь только один метод apply
в двигателе. Есть ли способ сделать много функций и сохранить их на карте, как показано выше?
Это является превосходным * * ответ. Я попробую и дам вам знать, есть ли у меня проблемы. Вы порекомендовали бы один из двух способов над другим? Я склоняюсь к первому, но у меня нет опыта Нашона. –
Работает как сон. Спасибо миллион :) –
Если вы собираетесь использовать jdk8 + и nashorn, я бы рекомендовал первый подход. –