2013-06-12 45 views
1

我有一個動物類的填充對象(animalObj)。當函數名存儲在字符串變量中時如何調用對象的Java函數?

Animal類有像

  1. getAnimal1()
  2. getAnimal2()等等

方法,所以我需要動態地調用這些方法從物體animalObj。

什麼,我需要的是這個

String abc="123"; 
for(int i=0; i<abc.length(); i++) 
    animalObj.getAnimal+abc.charAt(i)+(); 

我所知道的有關代碼是垃圾的實現,但我需要知道如何實現這一點。

我讀了關於java中的反射,看到一些問題,如 Java dynamic function callingHow do I invoke a Java method when given the method name as a string?

但是,這裏所有的問題都沒有處理填充對象。

有什麼建議嗎?

+2

嘗試搜索Java Reflections。 – StarPinkER

+0

你是什麼意思「但這裏他們沒有一個人口密集的對象。」? –

+4

錯誤的代碼設計。將我傳遞給該方法。 – m0skit0

回答

2
try { 
animalObj.getClass().getMethod("getAnimal"+abc.charAt(i)).invoke(animalObj); 
} catch (SecurityException e) { 
// ... 
} catch (NoSuchMethodException e) { 
// ... 
} 
+0

感謝這工作.. :-) 我認爲,在你的例子中沒有必要將它分配給方法對象嗎?因爲你已經在調用它了。 – abyin007

+0

是的,你說得對。將編輯 – Optional

1

嘗試與反思:

String methodName = "getAnimal" + abc.length(); 
try { 
    animalObj.getClass().getMethod(methodName).invoke(animalObj); 
} catch (SecurityException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { 
    throw new IllegalArgumentException("Could not call " + methodName 
     + ": " + ex.getMessage(), ex); 
} 

的multicatch是Java 7的語法,如果你不使用Java 7,你可以趕上個別例外或只是Exception

0

你可以使用反射,但它會讓你的垃圾代碼更加垃圾。正確的做法是重構每個getAnimal?方法融入他們自己的類中,擴展了一個普通的類。例如。

接口GetAnimalWrapper {void getAnimal(); }

GetAnimalWrapper animal1 = new GetAnimalWrapper(){void getAnimal(){/ * something * /}}; (){} getAnimalWrapper(){void * getAnimal(){/ * something else * /}};}}

現在你可以有GetAnimalWrapper對象的數組:

animObj.animArr = {animal1,animal2};

for(int i = 0; i < 2; i ++)animObj.animArr [i] .getAnimal();

相關問題