我有一个类Animal的填充对象(animalObj)。
动物类有像
这样的方法所以我需要从对象animalObj动态调用这些方法。
我需要的是这个
的实现String abc="123";
for(int i=0; i<abc.length(); i++)
animalObj.getAnimal+abc.charAt(i)+();
我知道代码是垃圾,但我需要知道如何实现它。
我在java中阅读了有关反射的内容并看到了一些问题 Java dynamic function calling,How do I invoke a Java method when given the method name as a string?。
但是这里所有的问题都没有涉及填充的对象。
有什么建议吗?
答案 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();