导入我的类的Java Scripting Engine不起作用

Aym*_*man 4 java scriptengine

一个代码值得1000字解释它:-)

package jasim;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JSTest {

    public static void main(String[] args) throws ScriptException {
        ScriptEngine jse = new ScriptEngineManager().getEngineByExtension("js");

        jse.eval("println(new jasim.JSTest().toString)");

    }

    @Override
    public String toString() {
        return "JSTest Object";
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码将失败,但以下情况除外:

Exception in thread "main" javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: ReferenceError: "jasim" is not defined. (<Unknown source>#1) in <Unknown source> at line number 1
Run Code Online (Sandbox Code Playgroud)

如何将自己的类导入ScriptEngine?

Aym*_*man 7

在查看Mozilla Rhino文档后,解决方案是使用:

importPackage(Packages.jasim) 在脚本内,或使用 new Packages.jasim.JSTest()

关于ScriptingEngine文档中的importPackage的Sun文档中,这一点并不十分清楚.

  • 该文档指出,“该类为脚本提供了额外的‘importPackage()’和‘importClass()’全局函数,但它们的广泛使用往往会用 Java 类的名称污染全局名称空间,并阻止加载的类进行垃圾回收。 “_ 使用 `JavaImporter` 可能会更好。 (2认同)