2016-06-16 65 views
0

在Rhino中,我有一个脚本化豆像下面犀牛到犀牛 - 添加属性/豆腐可用范围

/** 
* 
*/ 
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()函数像下面的编译脚本。

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); 

结果打印马特Murdock。我们可以直接在这里引用属性,因为SomeBean实例作为范围传递给脚本执行。

我无法在Nashorn中找到相应的方法。我可以使用源代码来获取CompiledScript实例,但是我不能将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实例的属性添加到作用域并在不使用前缀的情况下访问它们的方法?比如我们如何在犀牛中做到这一点。

回答

2
+0

谢谢,但我仍然必须使用符号来访问javascript中的属性。为了向范围添加某些东西,我必须将其放在绑定对象中,并使用键名称。在Rhino中,如果我们将脚本添加为执行范围,则可以直接通过访问属性。 – NishM

+0

当我们使用点运算符访问属性时,会调用AbstractJSObject.getMember()。 – NishM