13122


ScriptEngineクラスを用いて.jsファイルを実行し、  
その.jsファイルの中で、自作のJavaクラスを初期化して使いたいと思っています。

ここで記述するJavaScriptファイルでは

[code]

    importPackage(java.lang);
    
[/code]

のような記述をすればそのパッケージ内のクラスを初期化できるようになりますが、  
これはJavaの標準APIクラスだけのようです。

仮に自分で jp というパッケージを作って、  
上記の書式でインポートしようとしてもエラーが発生します  
(ScriptEngine#eval(String)でその行を読みこむとScriptExceptionが発生する)

何か解決策・代替案等あれば教えてください。

以下がそのソースです。  
Main.java

[code]

    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();
            }
        }
    }
    
[/code]

MyObject.java

[code]

    package jp;
    
    
    public class MyObject {
        public String getPrintText() {
            return "自分で作ったMyObjectクラスです。";
        }
    }
    
[/code]

test.js

[code]

    importPackage(java.lang);
    //エラー
    //importPackage(jp);
    
    function printTest() {
        println(new String("Javaの標準APIクラスのStringです"));
        //エラー
        //println(new MyObject().getPrintText());
    }
    
[/code]


CC BY-SA 3.0
2015-08-06T15:07:43.493
13118
2015-08-06T21:25:04.247
10677
question
javascript java
ScriptEngineが読み込むスクリプトの中でJavaの標準APIクラスしか初期化できない


本家の[Import a class in Scripting java
(javax.script)](https://stackoverflow.com/questions/3180188/import-a-class-in-
scripting-java-javax-script) に同様の質問があります。

要点は、`Packages` を付ける(つまり`Packages.jp`のようにする)ということです。  
（`java.lang`のjavaは、`Packages.java`のショートカットになっている）


CC BY-SA 3.0
2015-08-06T21:25:04.247
13122
2015-08-06T21:25:04.247
2017-05-23T12:38:55.250
-1
5044
13118
answer