Java 脚本引擎 : using value on Java side?

标签 java javascript scripting object rhino

在 Java 程序中,我正在调用用户定义的 JavaScript 程序:

File userJSFile=...;
javax.script.ScriptEngineManager mgr=new  ScriptEngineManager();
javax.script.ScriptEngine scripEngine= mgr.getEngineByExtension("js");
Object result=scripEngine.eval(new java.io.FileReader(userJSFile));

现在我想使用“result”:我怎样才能访问它?我可以将它识别为数组(我可以迭代它的成员吗)、StringInteger 等...?

谢谢

已编辑: 我只知道我的用户给了我一个返回最后一个值的脚本。我对这个值一无所知。它是 String、数组等吗?我不知道,但我想使用它。

最佳答案

也许除了简单的值,我宁愿让脚本引擎将其值强制转换为 Java 类型。

public class ScriptDemo {

  static class Result {
    private String[] words;

    public void setWords(String[] words) {
      this.words = words;
    }
  }

  static final String SCRIPT = "var foo = 'Hello World!';\n"
      + "result.setWords(foo.split(' '));";

  public static void main(String[] args)
      throws ScriptException {
    Result result = new Result();
    javax.script.ScriptEngineManager mgr = new ScriptEngineManager();
    javax.script.ScriptEngine scripEngine = mgr
        .getEngineByExtension("js");
    scripEngine.getContext().setAttribute("result", result,
        ScriptContext.ENGINE_SCOPE);
    scripEngine.eval(SCRIPT);
    System.out.println(Arrays.toString(result.words));
  }

}

即使您无法编辑脚本,您也可以获取返回值并通过您自己生成的脚本传递它以进行强制转换。这假定您对返回的值有所了解。


编辑:由于对返回值一无所知,我将首先使用 Java ( getClass() ) 对其进行测试,以查看它是否是 java.lang 类型之一。如果返回的对象来自某个库私有(private)的 API,我会使用脚本语言(在本例中为 JavaScript)对其进行内省(introspection),可能会在此过程中将其强制转换为 Java 类型或将其属性推送到某些 Java 数据结构中。

我的 JavaScript 很生疏,但 John Leach 的教程看起来相当不错:JavaScript Introspection .

(您可以使用 Java 反射,但由于引擎实现可能因 Java 版本/JRE/JavaScript 引擎而异,我不会依赖它。)

关于Java 脚本引擎 : using value on Java side?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078419/

相关文章:

javascript - 多选 Bootstrap 下拉选项选择器并不总是显示正确/不同的变量

http - 如何以编程方式测试网站是否使用 HTTPS?

c# - Netty protobuf 和 google csharp proto 使用

java - 响应式(Reactive)编程和消息队列的区别

java - 卡在 "Concurrency In Practise"文章中,没有 list 2.1。无状态 Servlet

Javascript Show 用于 php 登录表单

Angular js gulp sourcemap ngannonate 和 babel 中 JavaScript 堆内存不足

linux - bash 重命名空间 - 也做子文件和文件夹

macos - 使用 sed 在 bash 脚本中进行就地重命名

java - CrudRepository 按一对多关系过滤