黑马程序员技术交流社区

标题: 关于 反射的一个问题 [打印本页]

作者: 夏俊男    时间: 2014-12-6 13:49
标题: 关于 反射的一个问题
//这个程序的目的,是判断传入的对象是不是数组,如果是数组,就遍历打印,如果不是就原样输出。
//但是总是报Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array;求解求解啊
import java.lang.reflect.Array;
public class PrintArray {
        public static void main(String[] args) {
                // 定义个功能,来个数组打印数组,来个基本变量就打印数值
                int[] a = new int[]{110, 112, 119};
                sop(a);
        }

        private static void sop(Object obj) {
                // 利用反射来判断,传入的类是什么类型
                Class clazz = obj.getClass();
                if (clazz.isArray()) {
                        // 是数组,取元素打印
                        int len = Array.getLength(clazz);// 关键还是数组类,为我们提供了方法
                        for (int i = 0; i < len; i++) {
                                System.out.print(Array.get(clazz, i) + " ");
                        }
                } else {
                        // 不是数组是变量,直接打印
                        System.out.println(obj);
                }
        }

}


作者: Rain2692    时间: 2014-12-6 13:55
将类型改成引用对象呢,将int换成Integer,试试吧!!
作者: 夏俊男    时间: 2014-12-6 14:13
Rain2692 发表于 2014-12-6 13:55
将类型改成引用对象呢,将int换成Integer,试试吧!!

刚改了下,还是不可以,同样的错误
作者: 眸眼前缘    时间: 2014-12-6 14:21
错误:     int len = Array.getLength(clazz);// 关键还是数组类,为我们提供了方法   
正确:     int len = Array.getLength(obj);
错误:     System.out.print(Array.get(clazz, i) + " ");
正确:     System.out.print(Array.get(obj, i) + " ");
传入的是对象,不是字节码

作者: Rain2692    时间: 2014-12-6 14:26
字节码可能是数组吗??clazz.isArray()这个肯定不对啊
作者: Rain2692    时间: 2014-12-6 14:31
  1.   Class clazz = obj.getClass();
  2.            if (clazz.isArray()) {
  3.                    // 是数组,取元素打印
  4.                    int len = Array.getLength(obj);// 关键还是数组类,为我们提供了方法
  5.                    for (int i = 0; i < len; i++) {
  6.                            System.out.print(Array.get(obj, i) + " ");
  7.                    }
  8.            } else {
  9.                    // 不是数组是变量,直接打印
  10.                    System.out.println(obj);
复制代码

作者: Rain2692    时间: 2014-12-6 14:33
Rain2692 发表于 2014-12-6 14:31

你看看吧,你的代码已经改正了。。
作者: 有陷阱快跑丶    时间: 2014-12-6 14:58
private static void sop(Object obj)   应该是JDK1.5的可变参数导致的吧  JVM认为只要不符合Object[] obj,就不是一个数组,而是单独的一个对象  所以出现Argument is not an array提示   

我也刚看到这里  老师演示的是个String[] str .
作者: 夏俊男    时间: 2014-12-6 20:26
眸眼前缘 发表于 2014-12-6 14:21
错误:     int len = Array.getLength(clazz);// 关键还是数组类,为我们提供了方法   
正确:     int le ...

对的,对的。问题终于解决了,太谢谢了
作者: 考拉是只猫    时间: 2014-12-6 20:26
学习了~~~~~~~~
作者: 夏俊男    时间: 2014-12-6 20:28
Rain2692 发表于 2014-12-6 14:31

嗯,经过改正,终于不报错了。也理解了。太谢谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2