Типичный JSR-223 сценарий будет начинаться с серией суррогатного импорта, как это (JavaScript + Nashorn выбранного для примера):Как передать типы и функции сценарию JSR-223?
// "import" classes and static methods
var Foo = Java.type("my.package.Foo"); // application classes require Java.type() use
var bar = Foo.bar; // static method
var Logger = java.util.logging.Logger; // system classes can be accessed directly
var sin = java.lang.Math.sin; // the same for static methods
// use them
var foo = new Foo();
print(bar());
var log = Logger.getLogger("foo");
print(sin(42));
Я хочу, чтобы избавиться от этих суррогатов, подражая импортный подобные функциональные возможности для скриптов , Это означает, что я хочу иметь глобальные объекты (например, Foo
, bar
, Logger
и sin
в приведенном выше примере), созданный моим кодом Java. Это должно автоматически сделать общий набор импорта доступным для нескольких сценариев.
Я нашел два способа сделать это с Nashorn:
Метод 1: создать сценарий прелюдии и eval()
его перед основным скриптом. Это будет буквально первая половина кода примера выше.
Метод 2: Получение ссылки на класс и метод из ScriptEngine, кэширует их и использовать для последующих вызовов сценария:
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine nashorn = sem.getEngineByName("nashorn");
Object fooClass = nashorn.eval("Java.type('my.package.Foo')"); // instance of jdk.internal.dynalink.beans.StaticClass
Object loggerClass = nashorn.eval("java.util.logging.Logger"); // the same
Object barFunction = nashorn.eval("Java.type('my.package.Foo').bar"); // instance of jdk.internal.dynalink.beans.SimpleDynamicMethod
Object sinFunction = nashorn.eval("java.lang.Math.sin"); // the same
ScriptEngine nashorn1 = sem.getEngineByName("nashorn");
nashorn1.put("Foo", fooClass);
nashorn1.put("bar", barFunction);
nashorn1.put("Logger", loggerClass);
nashorn1.put("sin", sinFunction);
nashorn1.eval("var foo = new Foo(); bar(); var log = Logger.getLogger('foo'); print(sin(42));");
Очевидно, что ни один из этих методов не будет работать для любого другого JSR-223 двигатель. Есть ли способ реализовать то же самое в переносном режиме?
Имейте [здесь] (http://stackoverflow.com/questions/36968431/nashorn-how-to-pre-set-java-type-vars-inside-of-java-before-javascript-execut) – Zsolt