5

我正在使用 Rhino 在 Java 应用程序中嵌入一些 javascript。我按照 Rhino 网站上的示例,通过调用 Context 的 evaluateString 方法执行脚本并将实际脚本作为字符串传递。

我有一大堆想要使用的现有 javascript 代码。我不想将它全部连接成一个巨大的字符串并将其传递给评估字符串。我宁愿能够加载代码,以便我可以从传递给 evaluateString 的代码中调用它(有点像 AddCode 方法在 Microsoft 的脚本控制中工作)。我想添加代码,就像我目前可以使用 ScriptableObject.putProperty 方法添加变量一样。

有没有办法做到这一点?有人可以提供代码片段或文档链接吗?谢谢!

4

2 回答 2

2

文档示例看来,对先前评估对象的引用是由范围控制的。

Context context = Context.enter();
try {
  ScriptableObject scope = context.initStandardObjects();
  Object out = Context.javaToJS(System.out, scope);
  ScriptableObject.putProperty(scope, "out", out);
  context.evaluateString(scope,
      "function foo() { out.println('Hello, World!'); }", "<1>", 1, null);
  context
      .evaluateString(scope, "function bar() { foo(); }", "<2>", 1, null);
  context.evaluateString(scope, "bar();", "<3>", 1, null);
} finally {
  Context.exit();
}

(犀牛 1.7 第 2 版)


我知道有些人直接使用 Rhino 来获取最新版本,但Java 6 实现可以评估这样的脚本:

ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
engine.eval("function foo() { println('Hello, World!'); }");
engine.eval("function bar() { foo(); }");
engine.eval("bar();");
于 2010-06-19T13:03:09.687 回答
0

在我的代码中,我有这种需求(实用程序脚本等),我只是简单地将它们连接到一个巨大的 StringBuilder 中并对其进行评估(Java 6)。这是唯一的方法,因为 javascript 不能(没有 Java 包装器对象)otherJSScript.someUsefulFunction()。

于 2010-07-29T09:10:46.330 回答