Чтобы использовать функцию загрузки в js, встроенную из Java, вы должны сначала представить ее в контексте сценария. Вероятно, есть способ сделать это из 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