[英]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.