2009-10-16 53 views
2

我正在使用此項目中的Rhino 的javax.scripting。犀牛Javascript:如何將對象轉換爲Javascript原始?

我有一個Java方法返回一個Java對象(雙精度,長整數,等等)。我想從javascript調用該方法,並且將 作爲Javascript原始類型引用。但是,javacript將識別爲對象。

我該如何強制它轉換爲JavaScript原始圖片?

這個問題是非常相似的 http://groups.google.com/group/mozilla.dev.tech.js-engine.rhino/browse_thread/thread/2f3d43bb49d5288a/dde79e1aa72e1301

但問題是怎麼做的,我得到的背景和 的WrapFactory的參考?

示例代碼:

public class data 
{ 
    Double value = 1.0d; 
    public Number get() { return value; } 
} 


    public static void main(String[] args) 
    { 
      ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
      data data = new data(); 
      try 
      { 
        engine.eval("function test(data) { return data.getD('value1') + 5;};"); 
        System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
      } 
      catch (Exception e) 
      { 
        e.printStackTrace(); 
      } 
    } 

輸出: 結果:15

回答

3

請嘗試以下

public static void main(String [] args) throws Exception { 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName ("rhino"); 
     data data = new data(); 
     Context.enter().getWrapFactory().setJavaPrimitiveWrap(false); 

     try 
     { 
       engine.eval("function test(data) { return data.get('value1') + 5;};"); 
       System.out.println("Result:" + ((Invocable)engine).invokeFunction("test", data)); 
     } 
     catch (Exception e) 
     { 
       e.printStackTrace(); 
     } 
    } 

    public static class data 
    { 
     Double value = 1.0d; 
     public Number get(String arg) { return value; } 
    } 

或者,您可以修改JavaScript函數來顯式轉換值到一個數字:

function test(data) { return parseInt(data.get('value1'), 10) + 5;} 
+0

這給了我一個NullPointerException。 上下文。getCurrentContext()爲空 – Tazzy531 2009-10-16 19:05:08

+0

編輯提供正確的執行 – Kevin 2009-10-16 19:08:04

+0

無效。仍然得到:結果:15 – Tazzy531 2009-10-16 19:12:46

0

使用出發,按照你的JavaScript代碼的輸出:

function aFunction(data) 
{ 
    return parseInt(data); 
} 
0

我開發了這個應用程序,你輸入一組數學公式將被內置到Java 6中,JavaScript引擎來評價我相信是犀牛的港口。當時的想法是,我們將有一組地圖以及這些地圖將包含變量,如:

MAP["VALUE 1"] 
MAP["VALUE 2"] 

我使用的方法,因爲有些人是公式表達的來自那個是我的控制之下,該變量可能是無效的JS標識符。我的第一個方法是聲明一個映射並將其添加到JS引擎,但它失敗的方式與它失敗的方式相同 - 它將它解釋爲字符串,而不是數字。

解決方案是解析公式,找出正在使用的變量,然後在JS引擎中聲明對象。

事情是這樣的:

var MAP = new Object(); 
MAP["VALUE 1"] = 1; 
MAP["VALUE 2"] = 2; 

然後MAP["VALUE 1"] + MAP["VALUE 2"]將返回3,而不是12

可能會有更好的解決方案,但是一旦您完成初始編碼/解析,上述操作將始終有效。在我們的案例中,我們執行「聲明式」陳述的階段,以及執行公式的另一階段。 JS引擎非常快速,所以對我們來說不是問題。

相關問題