栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

捕获Nashorn的全局变量

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

捕获Nashorn的全局变量

我有一个可行的解决方案,但这显然是一个hack。

测试程序:

public class Nashorn {    public static void main(String[] args) throws scriptException {        scriptEngine engine = new scriptEngineManager().getEngineByName("nashorn");        Map<String, Object> map = new HashMap<>();        map.put("a", 10);        map.put("b", 20);        try (GlobalMap globals = new GlobalMap(map)) { engine.eval("c = a + b; a += b;", globals);        }        System.out.println("map = " + map);    }}

测试程序

map = {a=30.0, b=20, c=30.0}
根据需要输出。

GlobalMap
截取项将拦截Nashorn全局对象在key下的
"nashorn.global"
存储,因此不会将其存储在地图中。当
GlobalMap
关闭时,它会从原地图的犀牛全局对象,并将它们存储任何新的全局变量:

public class GlobalMap extends SimpleBindings implements Closeable {    private final static String NASHORN_GLOBAL = "nashorn.global";    private Bindings global;    private Set<String> original_keys;    public GlobalMap(Map<String, Object> map) {        super(map);    }    @Override    public Object put(String key, Object value) {        if (key.equals(NASHORN_GLOBAL) && value instanceof Bindings) { global = (Bindings) value; original_keys = new HashSet<>(global.keySet()); return null;        }        return super.put(key, value);    }    @Override    public Object get(Object key) {        return key.equals(NASHORN_GLOBAL) ? global : super.get(key);    }    @Override    public void close() {        if (global != null) { Set<String> keys = new HashSet<>(global.keySet()); keys.removeAll(original_keys); for (String key : keys)     put(key, global.remove(key));        }    }}

我仍然希望找到一种解决方案,将当前范围设置为

Map<String,Object>
Bindings
对象,并将脚本创建的任何新变量直接存储在该对象中。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509094.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号