当函数名存储在字符串变量中时,如何调用对象的Java函数?

时间:2013-06-12 09:40:48

标签: java reflection

我有一个类Animal的填充对象(animalObj)。

动物类有像

这样的方法
  1. getAnimal1()
  2. getAnimal2()等。
  3. 所以我需要从对象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?

    但是这里所有的问题都没有涉及填充的对象。

    有什么建议吗?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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);
}

multiatch是Java 7语法,如果你不使用Java 7,你可以捕获各个异常或仅Exception

答案 2 :(得分:0)

你可以使用反射但它会使你的垃圾代码更加垃圾。正确的方法是重构每个getAnimal?方法进入自己的类,扩展了一个公共类。 E.g。

  

interface GetAnimalWrapper {void getAnimal(); }

     

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

     

GetAnimalWrapper animal2 = new GetAnimalWrapper(){void getAnimal(){/ *其他* /}};

现在你可以拥有一个GetAnimalWrapper对象数组:

  

animObj.animArr = {animal1,animal2};

     

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