要在从Java嵌入的js中使用load函数,必须先在脚本上下文中公开它。可能有一种方法可以从Java中完成,但是也可以使用js进行操作。
免责声明:此解决方案使用了我正在开发的一个受Apache许可证授权的项目中提取的源代码。您可以在
这里查看原始源文件。
此js文件设置全局变量,并且保存在名为setupglobals.js的文件中。
var shell = org.mozilla.javascript.tools.shell.Main;
var args = ["-e","var a='STRING';"];
shell.exec(args);
var shellGlobal = shell.global;
//grab functions from shell global and place in current global
load=shellGlobal.load;
print=shellGlobal.print;
defineClass=shellGlobal.defineClass;
deserialize=shellGlobal.deserialize;
doctest=shellGlobal.doctest;
gc=shellGlobal.gc;
help=shellGlobal.help;
loadClass=shellGlobal.loadClass;
quit=shellGlobal.quit;
readFile=shellGlobal.readFile;
readUrl=shellGlobal.readUrl;
runCommand=shellGlobal.runCommand;
seal=shellGlobal.seal;
serialize=shellGlobal.serialize;
spawn=shellGlobal.spawn;
sync=shellGlobal.sync;
toint32=shellGlobal.toint32;
version=shellGlobal.version;
environment=shellGlobal.environment;
这是您原始的Java主机文件,现在已经增加了对setupglobals.js的评估,以便在其他脚本之前运行:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.mozilla.javascript.*;
public class RhinoRunner {
public static void main(String args[]) throws IOException
{
BufferedReader script = new BufferedReader(new FileReader("setupglobals.js"));
BufferedReader script2 = new BufferedReader(new FileReader("example.js"));
Context context = Context.enter();
try {
ScriptableObject scope = context.initStandardObjects();
context.evaluateReader(scope, script, "script", 1, null);
context.evaluateReader(scope, script2, "script2", 1, null);
Function fct = (Function)scope.get("abc", scope);
Object result = fct.call(context, scope, scope, new Object[] {2, 3});
System.out.println(Context.jsToJava(result, int.class));
}
finally
{
Context.exit();
}
}
}
这是您的example.js文件,现在已经使用全局加载函数来加载hello.js文件:
function abc(x,y)
{
return x+y
}
load("hello.js")
最后,这里是hello.js:
print("hello world!")
执行时,RhinoRunner会打印以下内容:
hello world!
5