Определение объекта Java по умолчанию/глобального для Nashorn script engine?
С помощью скриптового движка Nashorn Java я могу предоставлять объекты в контексте eval (), используя привязки, такие как:
Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("rules", myObj);
scriptEngine.eval("rules.someMethod('Hello')", scriptContext);
Я хотел бы иметь возможность упростить javascript, предоставив объект по умолчанию, так что вместо javascript будет:
rules.someMethod('Hello')
Я могу просто написать:
someMethod('Hello')
Есть ли какой-нибудь способ сделать это? (someMethod-это метод для объекта, а не статический метод)
1 ответ:
Вы можете использовать Object.расширение bindProperties nashorn для привязки свойств произвольного объекта к глобальному объекту JS. Таким образом, пользователь может вызывать методы (и получать доступ к свойствам) для вашего объекта "default" из скрипта без каких-либо оговорок. Смотрите Объект.документация bindProperties здесь https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-Object.bindProperties
Пример кода:
import javax.script.*; public class Main { public static void main(String[] args) throws Exception { ScriptEngineManager m = new ScriptEngineManager(); ScriptEngine e = m.getEngineByName("nashorn"); // get JavaScript "global" object Object global = e.eval("this"); // get JS "Object" constructor object Object jsObject = e.eval("Object"); Invocable invocable = (Invocable)e; // calling Object.bindProperties(global, "hello"); // which will "bind" properties of "hello" String object // to JS global object invocable.invokeMethod(jsObject, "bindProperties", global, "hello"); // you're calling "hello".toUpperCase()" e.eval("print(toUpperCase())"); // accessing bean property "empty" on 'hello' object e.eval("print(empty)"); // just print all (enumerable) properties of global // you'll see methods, properties of String class // (which'd be called on "hello" instance when accessed) e.eval("for (var i in this) print(i)"); } }
Comments