反射中方法的参数数量未知

时间:2016-06-05 09:44:06

标签: java reflection

例如,我有一个类PartE,如:

public class PartE implements Part
{
  protected String method = "getIndex" ;

  protected String getIndex ( double dummy,int dummyInt,String dummyString )
  {
    return "E" ;
  }
}

在这段代码中,我应该调用一个参数数量未知的方法。在这种情况下,它是getIndex(double,int,String)

可以这样:

getIndex()
getIndex(int)
getIndex(boolean,int)
getIndex(int,double,boolean)

所以无论参数组合如何,我都已经这样做了,但似乎我在params[i].newInstance()中做错了,因为它返回的实例化不合适。这就是我采取InstantiationException的原因。我遇到了什么困难?

Class c1 = null;

try {
    c1 = Class.forName( "PartE" );
} catch (ClassNotFoundException ex) {}

Object obj = null;
obj = c1.newInstance();

Method [] methods = c1.getDeclaredMethods();

for(Method m:methods)
  {
      m.setAccessible(true);

      Class<?>[] params = m.getParameterTypes();
      Object[] paramObjects = new Object[params.length];

      for (int i = 0; i < params.length; i++) 
      {
          paramObjects[i] = params[i].newInstance();
      }

      try {
         System.out.println(m.invoke(obj, paramObjects));  
      } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {}

1 个答案:

答案 0 :(得分:0)

你需要处理你所需要的课程不支持no-params构造函数的可能性,因为newInstance需要一个,IntegerDouble都没有。{1}}。这意味着您需要在循环中添加参数类型的分支,至少处理IntegerDouble。大概这个作业会告诉你这些论点应该使用哪些值(或者你使用的值并不重要),因为你不能通过null(你会得到一个如果您使用null,则取消装箱错误,因为该方法需要intdouble,而不是IntegerDouble)并且他们没有 - params构造函数。

这个答案是作为散文而不是代码故意给出的,因为分配的重点可能是学会编写代码。 : - )