0

典型的なJSR-223スクリプトは、次のような一連のサロゲート インポートで始まります (例として JavaScript + Nashorn が選択されています)。

// "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));

スクリプトのインポートのような機能をエミュレートすることで、これらのサロゲートを取り除きたいと考えています。つまり、Java コードで事前に作成されたグローバル オブジェクト (上記の例のFoobarLoggerおよび など) が必要です。sinこれにより、複数のスクリプトで使用できる共通のインポート セットが自動的に作成されます。

Nashorn でそれを行うための 2 つの方法を見つけました。

方法 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 エンジンでは機能しません。移植可能な方法で同じものを実装する方法はありますか?

4

1 に答える 1