2016-06-16 5 views
0

に利用可能なプロパティを追加/豆、Iはライノ - サイスコープ

/** 
* 
*/ 
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; 
    } 

} 

以下のようなスクリプト可能豆を持って私はスクリプト可能オブジェクトとして、この豆を取得しての評価()関数に渡すことができ以下のようなコンパイルされたスクリプト。

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インスタンスはスクリプト実行のスコープとして渡されるので、ここでは直接プロパティを参照できます。

Nashornと同等の方法はありません。私は、ソースを使用してCompiledScriptインスタンスを取得することができますが、キーを与えずにSomeBeanをバインディングに追加することはできません。JavaScript関数でメンバー(Name)を直接呼び出すことはできません。以下のコードは、プレフィックスキーなしでプロパティにアクセスすることができないので、明らかなエラーをスローします。

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

範囲にNSomeOtherBeanインスタンスのプロパティを追加し、接頭辞を使用せずにそれらにアクセスするためのNashornでの方法はありますか?私たちがRhinoでやっているように

答えて

2

ライノスクリプト化のNashorn当量がJavadocをjdk.nashorn.api.scripting.JSObject

参照される:

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

例:

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

をインスタンスはNashornによって "特別" として扱われるjava.util.Map、前記

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

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

。つまり、マップキーはNashornのオブジェクトプロパティと同様にアクセスできます。

+0

ありがとうございますが、私はまだという表記法を使用しなければなりません。はjavascriptのプロパティにアクセスするために使用します。スコープに何かを追加するために、私はそれを私のバインディングオブジェクトにキー名で入れなければなりません。 Rhinoでは、スクリプトの実行可能範囲を実行のスコープとして追加すると、でプロパティに直接アクセスできます。 – NishM

+0

AbstractJSObject.getMember()は、ドット演算子を使用してプロパティにアクセスするときに呼び出されます。 – NishM