ScriptEngineが読み込むスクリプトの中でJavaの標準APIクラスしか初期化できない
ScriptEngineクラスを用いて.jsファイルを実行し、
その.jsファイルの中で、自作のJavaクラスを初期化して使いたいと思っています。
ここで記述するJavaScriptファイルでは
importPackage(java.lang);
のような記述をすればそのパッケージ内のクラスを初期化できるようになりますが、
これはJavaの標準APIクラスだけのようです。
仮に自分で jp というパッケージを作って、
上記の書式でインポートしようとしてもエラーが発生します
(ScriptEngine#eval(String)でその行を読みこむとScriptExceptionが発生する)
何か解決策・代替案等あれば教えてください。
以下がそのソースです。
Main.java
package jp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class Main {
public static void main(String... args) {
//スクリプトエンジンを生成し、スクリプトを読み込む
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
load(engine, new File("test.js"));
//スクリプトを実行
Invocable invocable = (Invocable)engine;
try {
invocable.invokeFunction("printTest", (Object)null);
} catch (NoSuchMethodException | ScriptException e) {
e.printStackTrace();
}
}
private static void load(ScriptEngine engine, File jsFile) {
try {
String buffer;
String out = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(jsFile), "UTF-8"));
while((buffer = reader.readLine()) != null) out += (buffer + "\n");
reader.close();
engine.eval(out);
} catch(IOException | ScriptException ioe) {
ioe.printStackTrace();
}
}
}
MyObject.java
package jp;
public class MyObject {
public String getPrintText() {
return "自分で作ったMyObjectクラスです。";
}
}
test.js
importPackage(java.lang);
//エラー
//importPackage(jp);
function printTest() {
println(new String("Javaの標準APIクラスのStringです"));
//エラー
//println(new MyObject().getPrintText());
}