Java 在Nashorn中禁用ECMAScript扩展

Java 在Nashorn中禁用ECMAScript扩展,java,nashorn,Java,Nashorn,我需要在我的应用程序中运行一个简单的脚本,用户应该能够输入/修改这个脚本本身。该脚本用于检查/修改某些数据/字段集,例如可以表示为哈希表。逻辑很简单-检查一些值,并根据以前的检查修改其他值。逻辑很简单,但应该是灵活的,我有一个“遗留”C程序,它使用lua实现这一点。我首先找到了luaj,但后来我发现了第一部分: 如果在全局范围内求值以下内容,将获得所有属性,包括不可枚举的属性 Object.getOwnPropertyNames(this) 另见: (在“BblKTOP”发表评论后更新) 使用

我需要在我的应用程序中运行一个简单的脚本,用户应该能够输入/修改这个脚本本身。该脚本用于检查/修改某些数据/字段集,例如可以表示为哈希表。逻辑很简单-检查一些值,并根据以前的检查修改其他值。逻辑很简单,但应该是灵活的,我有一个“遗留”C程序,它使用lua实现这一点。我首先找到了luaj,但后来我发现了第一部分:

如果在全局范围内求值以下内容,将获得所有属性,包括不可枚举的属性

Object.getOwnPropertyNames(this)
另见:

(在“BblKTOP”发表评论后更新)

使用javax.script.Bindings迭代密钥集时,只返回(JS)可枚举属性。但是有一个与Object.getOwnPropertyNames(this)等价的对象。这大概是:

import javax.script.*;
import jdk.nashorn.api.scripting.*;

public class Main {
   public static void main(String[] args) throws Exception {
      ScriptEngineManager m = new ScriptEngineManager();
      ScriptEngine e = m.getEngineByName("nashorn");
      ScriptObjectMirror thiz = (ScriptObjectMirror)e.eval("this");
      // ScriptObjectMirror.getOwnKeys(boolean) returns all own property names. 
      // "true" to return all non-enumerable property names as well.
      // This is equivalent to JS call:
      //     Object.getOwnPropertyNames(this)
      for (String key : thiz.getOwnKeys(true)) {
          System.out.println(key);
      }
   }
}
第二部分:

我想你似乎已经涵盖了。但您可能需要确保在启用security manager的情况下运行。设置安全管理器后,所有脚本“eval”-ed都被视为沙盒脚本,因此不允许进行安全敏感操作


沙箱的另一个选择:考虑一个特定领域的语言,你可以把它翻译成JavaScript。p> 发现Nashorn通过ScriptObjectMirror#getOwnKeys返回有效属性。以下代码打印有效绑定:

    bd=engine.getBindings(ScriptContext.ENGINE_SCOPE);
    for(String key : ((ScriptObjectMirror) bd).getOwnKeys(true))
    {
        if(key!=null)
        {
            System.out.printf("'%s'='%s'\n", key, bd.get(key));
        }
    }

1) 好吧,这是可以理解的,但我只是想知道,真的没有办法从java检查它。另外,这种行为也很奇怪——为什么我不能获得绑定,尽管它可以被删除?2)它非常复杂,当然,我甚至可以像以前使用“C”模块那样制作自己的解释器,但最初的想法是使用一些标准的东西。我看到Lua在LuaJ中有一个很好的沙箱,但是ecmascript看起来更常见。非常奇怪的是,Oracle没有通过defaultSure为其创建任何沙盒参数,但其想法是在没有任何“eval”和执行任何脚本代码的情况下获取绑定。发现绑定#getOwnKeys可以在不进行评估的情况下实现这一功能。非常感谢。请看上面我的答案!我已经用ScriptObjectMirror.getOwnKeys更新了代码-我在您的第一条评论(编号为1)之后更新了我的答案!