2015-12-21 49 views
-3

我有4种不同的方法,只有一个需要一个参数:JAVA反射API如何知道将参数传递给哪个方法?

foo1(){} 
foo2(){} 
foo3 (String data) {} 
foo4(){} 

我调用使用Java反射API这些方法。我的代码看起来像这样的时刻:

  Mymethod method = new ActionKeyWords(); 

      Method [] methods = method.getClass().getDeclaredMethods(); 

      for (Method s : methods) { 

        if (s.getName().contains("foo3")) { 

         System.out.println("Executing method: " + s.getName()); 
         s.invoke(s.getName(),"data"); 


        else 
         System.out.println("Executing method: " + s.getName()); 
         s.invoke(s.getName()); 

       } 

      } 

你可以看到,我想提出一个控制,看看这些方法的名称是foo3调用方法之前。这是因为该方法是我想要传递参数的唯一方法。如果我删除if语句,我收到了"java.lang.IllegalArgumentException: wrong number of arguments".

否则怎么会在API知道哪些功能我想一个参数传递给?目前只有foo3需要一个参数,但是如果foo98也需要这个参数。

我为什么选择反射API的原因是在我的代码摆脱无休止的if语句的。

这是唯一的解决方案吗?有没有更聪明的方法来解决这个问题?

+5

反射api不知道。运行时出现错误。反思并不是摆脱if-else的解决方案。你需要重新考虑你的设计 – sidgate

+0

通常反射操作是昂贵的,你应该只使用反射节约和作为最后的手段。如果您提出了一个更好的背景,那么您可能会提出一个更好的解决方案。 – nickb

+0

'JAVA反射API如何知道将参数传递给哪个方法?'java反射api不知道将参数传递给哪个方法。你在说明方法名称和参数,你知道它 –

回答

2

为了检查什么是Method签名的部分参数,使用Method#getParameterTypes

0

反射API是不是这里有毛病,因为它需要你做的过滤。

你不应该使用反射像这样摆脱“if语句”一个长长的清单。反射电话几乎比你可以做的任何事情贵多倍。

你可能想尝试,而不是一系列的if/else的“开关”的语句(取决于究竟你IMPL。是)


为sidgate和Kayaman说,使用反射会造成当涉及到您的项目设计时,您会遇到很多问题。

其原因是是,你不能用良好的设计原则,也不能使用IDE功能/工具,将分析你的代码,并做分析。

如果你有一个方法的类的if/else语句来决定的构造函数/方法调用哪一个长长的名单,那么也许你应该使用,如Factory Pattern甚或的Builder Pattern(但决定上'construction pattern'哪些使用将取决于您的具体实施/需求)

+0

反射的问题不在于性能,而是它在设计上造成的破坏。 – Kayaman

+0

是的,的确如此,我只是给出了一个理由,认为它是一个坏主意。将编辑添加此。 – mawalker