2013-10-19 65 views
2

我試圖把所有的Java方法從JavaScript腳本訪問。Java可變參數和犀牛

正如我想要的「捷徑」,我遵循以下指南:https://stackoverflow.com/a/19197130/2897090。但是,當我的Java方法具有可變參數時,我無法「公開」使用javascript語言的方法。

public void printf(String format, Object... args) { 
    out.printf(format, args); 
} 
//Gives org.mozilla.javascript.EvaluatorException: Unsupported parameter type "[Ljava.lang.Object;" in method printf 

其他的事情:

如果我儘量讓JavaScript的 「一「只用快捷方式printf」:

function printf(format){ 
    java.lang.System.out.printf(format, arguments); 
} 

如果我輸入任何內容,我得到[email protected]如何解決是什麼?

謝謝。

更新

由於我沒有找到任何解決方案,我改變了方法:現在我只使用ScriptEngine。實際上我正在做的是暴露整個對象(不僅僅是函數)。不幸的是,每次我需要調用一個函數時,我需要用我公開的對象的名稱作爲前綴。

無論如何,我可以用可變參數創建我的Java方法,並在JavaScript端不做任何修改的情況下使用它們。

回答

0

我遇到了同樣的問題。從那以後,他們已經更新了關於FunctionObject的文檔。它只能接收一小部分數據。這是我的解決方案:

@JSFunction 
public void log(Object messages) { 
    if(messages instanceof List) { 
     console.log(((List)messages).toArray()); 
    } 
    else if (messages instanceof Object[]) { 
     console.log(((Object[])messages)); 
    } 
    else { 
     console.log(new Object[]{messages}); 
    } 
} 

我希望它採取一組對象打印出來。相反,我必須採用一個對象,然後使用反射來確定它是否在運行時是列表,數組或單個對象,並提供適當的處理。