java - 检查java ScriptEngine中是否存在函数

标签 java

有没有一种巧妙的方法来检查 java ScriptEngine 中是否存在函数。例如我创建了一个 ScriptEngine:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("function test(){"
            + "return ~-1;"
            + "}"
            + "test1 = 10;");

我目前检查一个函数是否存在的方法是做这样的事情:

engine.get("test").getClass().getName().equals("sun.org.mozilla.javascript.internal.InterpretedFunction")

我想知道是否有办法用 instanceof 来实现我现在遇到的问题是 sun.org.mozilla.javascript.internal.InterpretedFunction 不可行

最佳答案

任何以 sun.foo 开头的包都是 private API并且可能会更改,恕不另行通知。 尽管 JavaScript 的捆绑方式是 problematic无论如何。

不过,我更愿意让引擎来做测试:

private static boolean isFunction(ScriptEngine engine, String name)
    throws ScriptException {
  String test = "typeof " + name
      + " === 'function' ? java.lang.Boolean.TRUE : java.lang.Boolean.FALSE";
  return (Boolean) engine.eval(test);
}

此代码通过显式返回 java.lang.Boolean 来防止脚本引擎返回脚本原生 boolean 类型。

关于java - 检查java ScriptEngine中是否存在函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20578299/

相关文章:

java - 将列表划分为组的算法

java - ListView选择选项后如何显示数据?

java - 如何从现有的 java.util.Date 对象中单独获取时间和日期部分

java - 使用java 8 Stream分割ArrayList并进行统计

java - 在 Java 中同时迭代多个 arrayList..最有效

java - 如何为 Executors.newFixedThreadPool 设置超时并在超时后创建线程

java - 如何在后台2分钟后调用方法

java - JPA criteriaBuilder 中的列名称与父类名称冲突

java - java中的Docx到PDF转换

java - 尝试解密 RSA 时出错