2013-05-09 47 views
2

我使用GWT和我創建的類EverlinkedActions調用該方法cmd_addspace一個本地方法,它現在工作得很好:GWT:使用JSNI機方法:如何調用方法動態

private static native String execute(String functionName, Object[] vParams)/*-{ 
    try{   
     @es.gwt.client.dash.actions.impl.EverlinkedActions::cmd_addspace([Ljava/lanG/Object;)(vParams);   
    }catch(e){ 
     alert(e.message); 
    } 

}-*/; 

如何我可以使方法名稱動態嗎?它意味着而不是「cmd_addspace」,我想調用方法「functionName」,它的名稱作爲參數在本地方法中傳遞。

而他們的方式,使類名也動態?我想有這樣的事情:

private static native String execute(String className, String functionName, Object[] vParams)/*-{ 
    try{   
     @es.gwt.client.dash.actions.impl.className::functionName([Ljava/lanG/Object;)(vParams);   
    }catch(e){ 
     alert(e.message); 
    } 

}-*/; 

感謝所有幫助

+0

你想調用Java函數或JavaScript方法嗎?如果是Java,則可以在Java中調用通用方法,傳入名稱並使用反射。 http://stackoverflow.com/questions/160970/how-do-i-invoke-a-java-method-when-given-the-method-name-as-a-string – 2013-05-09 13:56:12

+0

感謝您的鏈接。我已經嘗試過,但我正在獲取此錯誤:java.lang.reflect.Method不能在客戶端調用 – user2318955 2013-05-09 14:01:19

+0

哦,我忘了GWT沒有實現反射。 – 2013-05-09 14:07:04

回答

4

不知道你想什麼,真正實現在這裏,但我怕JSNI不喜歡的工作。

代碼(如@es.gwt.client.dash.actions.impl.EverlinkedActions::cmd_addspace([Ljava/lanG/Object;)(vParams);)在編譯時需要是完全可解析的符號,因爲類和方法名將被其最小化版本替換。