首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >犀牛到纳什霍恩-添加属性/bean可用于范围

犀牛到纳什霍恩-添加属性/bean可用于范围
EN

Stack Overflow用户
提问于 2016-06-16 05:25:03
回答 1查看 678关注 0票数 0

在Rhino,我有一个像下面这样的脚本化的bean

代码语言:javascript
复制
 /**
 * 
 */
package test.rhino;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.mozilla.javascript.FunctionObject;
import org.mozilla.javascript.Scriptable;

/**
 * @author 
 * 
 */
public class SomeBean implements Scriptable, Map<String,Object> {

    /**
     * The current values for this object.
     */
    private HashMap<String, Object> values = new HashMap<>();

    /**
     * 
     */
    public SomeBean() {
        System.out.println("SomeBean();");
    }

    /*
     * @see org.mozilla.javascript.Scriptable#getClassName()
     */
    @Override
    public String getClassName() {
        return "SomeBean";
    }

    /*
     * @see org.mozilla.javascript.Scriptable#get(java.lang.String,
     * org.mozilla.javascript.Scriptable)
     */
    @Override
    public Object get(String name, Scriptable start) {

        System.out.println("Get is called.");
        System.out.println("Called for this" + name + " and returned :" + values.get(name));

        return values.get(name);
    }

    /*
     * @see org.mozilla.javascript.Scriptable#put(java.lang.String,
     * org.mozilla.javascript.Scriptable, java.lang.Object)
     */
    @Override
    public void put(String name, Scriptable start, Object value) {
        System.out.println("Put is called. Input name: " + name + "\n Input values: " + value);

        values.put(name, value);

    }

    @Override
    public Object get(int index, Scriptable start) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean has(String name, Scriptable start) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean has(int index, Scriptable start) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void put(int index, Scriptable start, Object value) {
        // TODO Auto-generated method stub

    }

    @Override
    public void delete(String name) {
        // TODO Auto-generated method stub

    }

    @Override
    public void delete(int index) {
        // TODO Auto-generated method stub

    }

    @Override
    public Scriptable getPrototype() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setPrototype(Scriptable prototype) {
        // TODO Auto-generated method stub

    }

    @Override
    public Scriptable getParentScope() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setParentScope(Scriptable parent) {
        // TODO Auto-generated method stub

    }

    @Override
    public Object[] getIds() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object getDefaultValue(Class<?> hint) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean hasInstance(Scriptable instance) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean containsKey(Object key) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean containsValue(Object value) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object get(Object key) {
        System.out.println("MAP -- Get is called.");
        // TODO Auto-generated method stub
        return values.get(key);
    }

    @Override
    public Object put(String key, Object value) {
        values.put(key, value);
        System.out.println("MAP -- Put is called.");
        // TODO Auto-generated method stub
        return value;
    }

    @Override
    public Object remove(Object key) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void putAll(Map<? extends String, ? extends Object> m) {
        // TODO Auto-generated method stub

    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub

    }

    @Override
    public Set<String> keySet() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Collection<Object> values() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Set<java.util.Map.Entry<String, Object>> entrySet() {
        // TODO Auto-generated method stub
        return null;
    }

    private static Scriptable globalPrototype;

    public static void finishInit(Scriptable scope, FunctionObject constructor, Scriptable prototype) {
        System.out.println("finishInit is called.");
        globalPrototype = prototype;
    }

}

我可以作为一个可脚本对象检索这个bean,并将它传递给编译脚本的eval()函数,如下所示。

代码语言:javascript
复制
String src5 = "(function(){return Name;})();\n";
Script sc = getCompiledScript(src5);
SomeBean sb = new SomeBean();
sb.put("Name", "Matt Murdock");
Scriptable sp = (Scriptable) sb;
result = script.exec(context, sp);

结果打印了马特·默多克。我们可以在这里直接引用属性,因为SomeBean实例作为作用域传递给脚本执行。

我在纳什霍恩找不到类似的方法。我可以使用源代码获取一个CompiledScript实例,但如果不给它一个键,就不能将SomeBean添加到绑定中,并且不能在SomeBean函数中直接调用它的成员(名称)。下面的代码抛出错误,这是显而易见的,因为没有前缀键我们无法访问属性。

代码语言:javascript
复制
NSomeOtherBean nsob = new NSomeOtherBean(); // extends AbstractJSObject
nsob.setMember("Name", "Bruce Wayne");

Bindings binding = engine.createBindings();
binding.put("nsob", nsob);
engine.setBindings(binding, ScriptContext.GLOBAL_SCOPE);
result = engine.eval("(function(){return Name;})();\n",binding);

Nashorn中是否有一种方法可以在不使用前缀的情况下将NSomeOtherBean实例的属性添加到作用域并访问它们?就像我们在犀牛身上能做的那样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-16 07:59:10

Nashorn等价于Rhino脚本是jdk.nashorn.api.scripting.JSObject

见javadoc:

https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/JSObject.html

https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/AbstractJSObject.html

示例:

example.js

http://hg.openjdk.java.net/jdk9/dev/nashorn/file/efeb16c75392/samples/BufferArray.java

mapreduce.js

也就是说,纳什霍恩将java.util.Map实例视为“特殊”实例。也就是说,可以像Nashorn中的对象属性一样访问Map键。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37850484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档