2016-06-10 113 views
0

我有一個腳本化豆如下所示遷移犀牛腳本化豆到犀牛

package test.rhino; 

import java.util.HashMap; 

import org.mozilla.javascript.Scriptable; 

public class SomeBean implements Scriptable { 

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

} 

在Rhino中,使用JavaScript我可以訪問在基礎HashMap作爲bean的屬性的密鑰。

var bean = new SomeBean();" 
       + "bean.nomen = 'John Doe';\n" 
       + "bean.nomen2 = bean.nomen + ' is cool'; 

輸出顯示被稱爲key和value的輸入和輸入是從HashMap的'values'中添加和訪問的。這樣我也可以添加額外的功能來獲取()和put()方法的定義。

將此bean移植到Nashorn時,我無法找到具有相同功能的方法。 Nashorn在JavaScript中公開了HashMap,並允許我們添加條目,但對於我來說,這種行爲應該可以通過一個通用的setter或getter從bean實例訪問,這樣我就可以在HashMap中添加和檢索值時做更多的事情。

因此,它應該像下面: -

Assume bean = new SomeBean(); 
bean.name = 'John Doe' // Adds name and John Doe to the HashMap 
print(bean.name) // Retrieves John Doe. 

有沒有辦法在犀牛做到這一點?我知道公共類變量可用於我的bean實例,但是這並不能提供與上面所示相同的功能。我不想直接訪問HashMap。

謝謝。

回答

1

經過大量的挖掘,我能夠通過從'AbstractJSObject'類擴展我的bean來解決這個問題。這個類具有代理獲取,設置和方法,當我們嘗試使用點運算符訪問/更改對象屬性時,將調用這些方法。

更改後的類如下所示。

package test.nashorn; 

import java.util.HashMap; 

import jdk.nashorn.api.scripting.AbstractJSObject; 

public class NSomeOtherBean extends AbstractJSObject { 

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

    public NSomeOtherBean() { 
     System.out.println("Constructor called."); 
    } 

    // do you have a property of that given name? 
    @Override 
    public boolean hasMember(String name) { 
     return has(name); 
    } 

    // get the value of that named property 
    @Override 
    public Object getMember(String name) { 

     return get(name); 

    } 

    // get the value of that named property 
    @Override 
    public void setMember(String name,Object value) { 

     put(name,value); 

    } 

    public Object get(String name) { 

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

     return values.get(name); 
    } 

    public void put(String name, Object value) { 
     System.out.println("JAVA Put is called. Input name: " + name + "\n Input values: " + value); 

     values.put(name, value); 

    } 

    public boolean has(String name) { 
     System.out.println("JAVA Has is called. Input name: " + name); 

     return values.containsKey(name); 

    } 
}