0

我正在使用 Rhinocontext.evaluateString()从 Java 内部运行一些简单的 JavaScript。它是嵌入 Javascript 指南中的教科书:

String script = // simple logic
Context c = new ContextFactory().enterContext();
ScriptableObject scope = context.initStandardObjects();
Object o = context.evaluateString(scope, script, "myScript", 1, null);
ScriptableObject result = Context.jsToJava(o, ScriptableObject.class);

我不确定这是当前的最佳实践,因为主要的 Rhino 文档似乎已关闭,但到目前为止它正在工作。

我希望能够引用工作目录中的库——我看到Rhino shell 支持load,但我认为这在嵌入引擎中不起作用。

这可能吗?它在任何地方都有记录吗?理想情况下,我希望能够调用类似的东西load('other.js')并让它搜索我指定为全局属性的目录。

4

1 回答 1

0

我有一个我不太喜欢的答案,尤其是因为它暴露了我很确定是在过去半小时里让我发疯的 Rhino 错误:

eval("" + Packages.org.apache.commons.io.FileUtils.readFileToString(
  new java.io.File("/the/local/root", "script.js");
));

{ 这"" + ...就是我解决这个错误的方法——如果你eval()是一个 Java String(例如从readFileToString调用中返回)而不手动将它强制转换为 JavaScript 本机字符串,那么似乎什么也没有发生。通话只是默默地失败。}

这会盲目地读取一个任意文件并对其进行评估——当然,这是你eval()在 Java 方面所做的,所以我不太担心。

无论如何,由于多种原因,它并不优雅,但它确实有效。我很想听到更好的答案!

于 2012-09-17T15:39:17.137 回答