A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨盼 中级黑马   /  2012-2-25 21:43  /  1844 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在反射中,可以利用Object输出一维数组,部分代码,如下
       public static void print(Object obj){
                Class<?> c=obj.getClass();
                if(!c.isArray()){
                        return ;
                }
                Class<?> arr=c.getComponentType();
                System.out.println(arr.getName()+"长度是:"+Array.getLength(obj));
                for(int x=0;x<Array.getLength(obj);x++){
                        System.out.print(Array.get(obj, x)+"、");
                }
        }
此时Object对象表示整个一维数组,如果换成二维,或者多维的,怎么利用Object输出二维数组,还是反射只能操作一维数组,查了很多都没有找到关于发射操作二维以上数组的,知道的答案的请不吝赐教啊~~~~谢谢啦

3 个回复

倒序浏览
改进代码,如下:
        public static void print(Object obj){
        Class<?> c=obj.getClass();  
        if(c.isArray()){
                Class<?> arr = c.getComponentType();
                        System.out.println(arr.getName()+"长度是:"+Array.getLength(obj));//打印了数组名称和 长度,但是长度的出现是通过Array的静态方法。
            if(arr.isArray()){
                        for(int x=0;x<Array.getLength(obj);x++){                 
                                Object temp = Array.get(obj, x) ;
                                print(temp);
                                System.out.print(Array.get(obj, x)+"、");
                        }
            }
            else
                    return ;
        }
}

测试代码:
                String[][][] a = {{{"ss"}}};
                print(a);       
结果为:
[[Ljava.lang.String;长度是:1
[Ljava.lang.String;长度是:1
java.lang.String长度是:1
[Ljava.lang.String;@6bade9、[[Ljava.lang.String;@166afb3、

思路就是用了递归方法,但是有一个地方要注意,就是要用到获取数组元素的 引用 并进行 函数传值 来完成递归的调用。
回复 使用道具 举报
在网吧很痛苦啊,周围尽是吵闹声。。。。。。。。。所以代码的改进这么久才出来。如下:
        private static void print(Object obj, int tint) {
                Class<?> clazz = obj.getClass();
                if (clazz.isArray()) {
                        System.out.println("这是第"+tint+"层数组:"+obj+"长度:"+Array.getLength(obj)+"类型:"+obj.getClass().getComponentType());
                        tint++;
                        for (int i = 0; i < Array.getLength(obj); i++) {
                                Object temp = Array.get(obj, i);
                                print(temp, tint);
                        }
                } else {
                        System.out.println("第" +tint+"层元素:("+obj+")结束");
                }
        }
        public static void print(Object obj) {
                print(obj, 1);
        }

测试代码如下:
                String[][] a = { { "a", "b", "c" }, { "d", "e" }, { "f" } };
                print(a);
打印结果:

这是第1层数组:[[Ljava.lang.String;@119dc16长度:3类型:class [Ljava.lang.String;
这是第2层数组:[Ljava.lang.String;@c05d3b长度:3类型:class java.lang.String
第3层元素:(a)结束
第3层元素:(b)结束
第3层元素:(c)结束
这是第2层数组:[Ljava.lang.String;@128f6ee长度:2类型:class java.lang.String
第3层元素:(d)结束
第3层元素:(e)结束
这是第2层数组:[Ljava.lang.String;@6bade9长度:1类型:class java.lang.String
第3层元素:(f)结束

建议贴主命名的时候一定要注意,否则自己的思路容易被打乱。
回复 使用道具 举报
看着很代码很多,还用到两个函数,我稍微改了下,比较简洁了,如下
        public static void printTemp(Object obj){
                Class<?> c=obj.getClass();
                if(c.isArray()){
                        System.out.println();
                        for(int y=0;y<Array.getLength(obj);y++){
                                Object temp=Array.get(obj, y);
                                printTemp(temp);   //递归调用
                                //System.out.print(Array.get(obj, y)+"、");
                        }
                }else
                        System.out.print(obj);   //打印数组
        }
测试的例子:
int[][] t={{1,2,3},{4,5,6},{7,8,9,0}};
printTemp(t);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马