1

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

动物类有类似的方法

  1. 获取动物1()
  2. getAnimal2() 等

所以我需要从对象animalObj动态调用这些方法。

我需要的是这个的实施

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

我知道关于代码是垃圾,但我需要知道如何实现它。

我阅读了 Java 中的反射,并看到了一些问题,例如 Java 动态函数调用将方法名称作为字符串给出时如何调用 Java 方法?.

但是这里所有的问题都不是处理填充对象。

有什么建议么?

4

3 回答 3

2
try {
 animalObj.getClass().getMethod("getAnimal"+abc.charAt(i)).invoke(animalObj);
} catch (SecurityException e) {
// ...
} catch (NoSuchMethodException e) {
// ...
}
于 2013-06-12T09:50:31.940 回答
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.

于 2013-06-12T09:47:35.373 回答
0

您可以使用反射,但它会使您的垃圾代码更加垃圾。正确的做法是重构每个 getAnimal? 方法到他们自己的类中,该类扩展了一个公共类。例如

接口 GetAnimalWrapper{ void getAnimal(); }

GetAnimalWrapper animal1 = new GetAnimalWrapper(){ void getAnimal(){ /* 一些东西 */ } };

GetAnimalWrapper animal2 = new GetAnimalWrapper(){ void getAnimal(){ /* 别的东西 */ } };

现在您可以拥有一组 GetAnimalWrapper 对象:

animObj.animArr = {动物1,动物2};

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

于 2013-06-12T09:59:19.133 回答