2010-05-31 83 views
3

調用函數的名稱,我希望能夠根據字符串提供的名稱來調用函數。類似於從字符串java

public void callByName(String funcName){ 
    this.(funcName)(); 
} 

我已經搜索了一下lambda funcions,但它們不受支持。我在考慮去參加反思,但是我對編程有點新,所以我對這個主題不太熟悉。

當我開始GUI(Swing,swt)編程和事件時,我的java OOP類就提出了整個問題。我發現使用object.addActionCommand()非常難看,因爲我稍後需要製作一個Switch並捕捉我想要的確切命令。

我寧願做一些類似於object.attachFunction(btn1_click)的事情,以便在引發事件點擊時調用btn1_click函數。

回答

4

Java有方法,而不是函數。不同之處在於方法有類,你需要知道這個類來調用這個方法。如果它是一個實例方法,你需要一個實例來調用它,但OTOH它意味着你可以看看該方法起來很方便:

public void callByName(Object obj, String funcName) throws Exception { 
    // Ignoring any possible result 
    obj.getClass().getDeclaredMethod(funcName).invoke(obj); 
} 

注意,有潛在的異常的很多出於此以及得到的東西,如果你想傳遞參數在更復雜的

如果你是在談論一個類的方法,你做的是稍有不同:

public void callClassByName(Class cls, String funcName) throws Exception { 
    // Ignoring any possible result 
    cls.getDeclaredMethod(funcName).invoke(null); 
} 

您可能還需要使用探索3210。

0

檢查Class.forName()以獲取給定名稱的類定義。

如果您有一個包含您想運行的方法的接口,並且該類實現了此方法,那麼您可以創建一個實例,將其轉換爲接口並調用該方法。

如果您不能採取任何措施,請對類的實例使用反射以獲取所需的方法,並使用它需要的參數調用它。 Sun教程有一個很好的反思部分。

1

您可以使用Class.getDeclaredMethod()獲得具有特定名稱和參數的方法,然後調用返回的Method對象:

Method method = MyClass.class.getDeclaredMethod("methodName", Event.class, String.class); 
Object retVal = method.invoke(someEvent, someString); 
0

是,反射API可用於做到這一點,但我不認爲這是簡單的按鈕事件處理的方式。最好問一下如何在你使用的GUI框架中優雅地完成這個工作(Swing,SWT ..),我相信必須有一個比Reflection更簡單的方法。

2

下面的代碼將調用指定名稱的公共方法,不帶參數:

public void callByName(String funcName) { 
    try { 
     Method method = getClass().getDeclaredMethod(funcName); 
     method.invoke(this, new Object[] {}); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
}