【问题标题】:Iterating through Parameter Array - Java Reflection遍历参数数组 - Java 反射
【发布时间】:2014-07-02 05:57:42
【问题描述】:

我是 java 新手,无法弄清楚为什么第二种遍历参数的方法会引发异常。 有趣的是param !=null 通过但我后来得到ArrayIndexOutofBounds 异常。 我查看了以下链接。但这对我没有帮助。 Iterating through method parameters

import java.lang.reflect.*;

public class TestReflection {

    public static void main(String[] args) {
    Class<ReflectThis> c = (Class<ReflectThis>)ReflectThis.class;
    System.out.println("public class " + c.getName());
    System.out.println("{");
    Method methods[] = c.getMethods();
    for(Method m : methods)
    {
        if(m.isAccessible())
            System.out.print("    public ");
        else
            System.out.print("    private ");

            System.out.print(m.getName()+"(");
        //System.out.println("Parameteres");
        Parameter[] params = null;
        params = m.getParameters();
            //method 1 for iterating thr params
        for(Parameter p : params)
        {
            if(p ==  null)
                break;
            System.out.print(p.getType()+ " " +p.getName()+",");

        }
        params = m.getParameters();
            //method 2 for iterating thr params
    if(params != null)
        {
            for(int i=0; params[i] != null; i++)
            {
                System.out.print(params[i].getType()+ " " +params[i].getName());
                if(params[i+1] != null)
                    System.out.print(", ");
            }
        }
        System.out.println(");");
    }

    System.out.println("}");

    }

}

【问题讨论】:

    标签: java reflection


    【解决方案1】:

    你只是在循环出界。

     for(int i=0; params[i] != null; i++)
     {
          System.out.print(params[i].getType()+ " " +params[i].getName());
          if(params[i+1] != null)
               System.out.print(", ");
     }
    

    如果您有 2 个参数,即。 i0变为1,然后你会尝试访问

    params[1]
    params[2] // out of bounds
    

    这基本上总是超出范围,因为您尝试访问的元素数量比数组中的元素数量多一个。

    以下是使用, 正确连接元素的方法:

    【讨论】:

    • 谢谢,这样我就可以使用方法一在除了最后一个参数之外添加逗号。
    【解决方案2】:

    好的,错误在于:

    for(int i = 0; params[i].....
    

    如果 params 为空,则会引发异常。示例:params 具有 in 元素。试图获取第 0 个元素将超出界限。

    为确保不会发生这种情况:

    for(int i = 0; i < params.length && params[i]...
    

    【讨论】:

    • 谢谢。当方法没有参数时,我希望 params 为空。但我错了。
    【解决方案3】:

    在这一行中,如果 i 大于最后一个索引,则会出现异常:

    for(int i=0; params[i] != null; i++)
    

    你必须改为:

    for(int i=0; i<params.length; i++)
    

    【讨论】:

      【解决方案4】:

      看起来意图是在数组上循环并附加“,”,最后一个条目除外。下面应该工作 还需要检查边界条件

              for(int i=0; i<params.length; i++)
              {
                  if(params[i] != null)
                  {
                   System.out.print(params[i].getType()+ " " +params[i].getName());
      
                   if(i != params.length-1)
                       System.out.print(", ");
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 2017-07-11
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多