2013-06-12 33 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();

相关问题