从Nashorn移除Globals

时间:2017-01-20 17:36:12

标签: nashorn

有没有办法在Nashorn中删除对

的全局变量的访问权限
$ENV=undefined

我做了一些搜索,但除了如何使用全局变量之外,我无法看到任何其他内容。

另外,是否有可以传递给脚本引擎的参数/标志列表?我目前正在做--no-java,但我无法在任何地方找到全面的列表。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您可以通过jjs -help获取命令行选项列表。

我不确定要删除全局变量,但我对此表示怀疑。 Nashorn使用代表ECMAScript Global对象的global类,如here所述。

  

默认上下文的ENGINE_SCOPE是ECMAScript的包装实例" global"对象 - 这是"这个"在顶级脚本表达式中。因此,您可以访问ECMAScript顶级对象,例如"对象","数学"," RegExp","未定义"来自此范围对象。 Nashorn全局范围对象由名为jdk.nashorn.internal.objects.Global的内部实现类表示。

Global类有一堆基本的ECMAScript管道以不可变的方式加入其中,因为没有它,javascript根本不起作用(没有ObjectFunction例如原型)。该页面指出,尝试将替代对象用作全局将导致引擎放置您的自定义全局'将对象转换为新的Global实例。尝试在没有global管道的情况下运行Javascript根本不起作用。

现在,如果你想要做的是限制脚本可用的Java类,那就相对简单了(尽管不像我希望的那样简单)。

ClassFilter filter = new ClassFilter() {
    @Override
    public boolean exposeToScripts(String name) {
        // This would disable all Java classes
        return false;
    }
};
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(filter);

这里的主要缺点是ClassFiltergetScriptEngine(ClassFilter)方法不是javax.scripting API的一部分,您必须访问{中的Nashorn特定类{1}}直接打包。