Java ScriptEngine:在Java端使用值?

Pie*_*rre 7 javascript java scripting rhino object

在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));
Run Code Online (Sandbox Code Playgroud)

现在我想使用' 结果 ':我怎样才能访问它?我可以将它识别为一个数组(我可以迭代扔掉它的成员),a String,an Integer等等吗?

谢谢

编辑:我只知道我的用户给了我一个返回最后一个值的脚本.我对这个价值一无所知.它是String一个阵列等等吗?我不知道,但我想用它.

McD*_*ell 9

除了简单的值之外,我宁愿让脚本引擎将其值强制转换为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));
  }

}
Run Code Online (Sandbox Code Playgroud)

即使您无法编辑脚本,也可以获取返回值并将其传递给您自己生成的脚本以执行强制操作.这假设您了解返回的值.


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

我的JavaScript很生疏,但John Leach的教程看起来很不错:JavaScript内省.

(您可能可以使用Java反射,但由于Java版本/ JRE/JavaScript引擎之间的引擎实现可能不同,我不会依赖它.)


kgi*_*kis 0

链接可能会有所帮助。看来您能做的最好的事情就是依赖于特定于实现的类。