簡體   English   中英

Rhino和Java之間通過JSR223進行互操作:使用Javascript對象實例

[英]interoperation between Rhino and Java via JSR223: working with Javascript Object instances

這與關於數組的其他SO問題非常相似。

如果我評估:

y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"}

在通過JSR223(ScriptingEngine)實例化的Javascript腳本中,我得到了NativeObject (我在Eclipse的調試器中看到了), NativeObject知道如何訪問其屬性。 此外,我什至不知道哪個.jar文件(如果有的話),我需要添加到我的構建路徑中才能使用相關的類,並且如果我找到了可以在Rhino Javascript中使用的方法,則對於Jython。

似乎JSR223應該包括對ScriptingEngine的語言不可知的訪問方法,以提供將返回的對象包裝為數組的List<Object>或關聯數組的Map<String, Object>功能。

有什么建議么?

我也試圖嵌入比jsr223或bsf更多功能的不同腳本語言。 為此,我必須定義自己的接口並圍繞每個不同的腳本引擎實現這些。

我想要的一個功能是能夠將Function(具有單個方法的Java接口)傳遞給腳本引擎,並使其在傳遞參數時可以正常工作。 我的每個嵌入式腳本引擎都有一個層,在該層中,我可以從腳本環境中包裝Java值/將包裝值解包。

我建議解決此問題的最佳方法是讓您的腳本引擎包裝器提供getValue(String name)並修復將其轉換為Java List的javascript數組。 自然,setValue(String,Object)將檢查該值是否為List並將其轉換回js數組,依此類推。 它乏味的:()

將其轉換為java對象並返回。 然后,您可以像平常一樣使用java對象。

以下是轉換函數示例

function convertToJava(o) {
    var rval;
    if (Array.isArray(o)) {
        rval = new java.util.ArrayList();
        for (var key in o) {
            rval.add(convertToJava(o[key]));
        }
    } 
    else if (typeof o === 'object') {
        rval = new java.util.HashMap();
        for (var key in o) {
            rval.put(key, convertToJava(o[key]));
        }
    }
    else if (typeof o === 'function') {
        // skip
    }
    else if (typeof o === 'undefined') {
        // skip
    }
    else {
        rval = o;
    }
    return rval;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM