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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏腾飞 黑马帝   /  2012-3-11 09:28  /  1789 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

        private static void fansheArray(Object obj1){
                 Class obj2= obj1.getClass();
        if(obj2.isArray()){
                int len=0;
                len=Array.getLength(obj2);//问题1.此处为什么是Array.getLength()而不是,obj.length;
                for (int i = 0; i <len; i++) {//题2.反射到底干什么用,具体什么时候用。
                        System.out.println(Array.get(obj2, i));
                        
                }
        }else{System.out.println(obj2);}
        
}

2 个回复

倒序浏览
问题1:这里的Class obj2= obj1.getClass();获取的是obj1的字节码,所以obj2是对象所对应类的字节码,
而Array.getLength(obj2);是在反射中专门用于获取字节码所代表对象的数组的长度的,而obj.length是
获取一般数组对象的长度,不能用于反射中


问题2:反射其实就是程序能够自检查自身信息。就像程序会照镜子反光看自己。

在程序中可以检查某个类中的方法属性等信息,并且能够动态调用。
这样可以写出很灵活的程序。
比如要把一个对象中的数据copy到另外一个对象中,规则是属性名相同就copy,
就可以用反射来做,不需要指定每个属性的名字,只要动态从类中取得信息,
再判断属性名是否相同即可。当然应用还有很多。

反射可以结合Java的字节码,使用ASM和cglib等库,还能动态生成类。
hibernate的延迟载入,spring的AOP都是这么实现的

反射给Java带来了一些动态性。不过虽然很好,但毕竟还是有一定局限性的。另外ASM,cglib使用还是不放便。因此一些纯动态语言现在是一个重要发展趋势,比如ruby,python等,程序很容易动态生成。
回复 使用道具 举报
看下第一个问题, if(obj2.isArray())我们可以判断传进来的是Array集合,既然是Array集合自然要用对集合的操作方法,Array.getLength(obj2)得到集合中元素的个数。
问题2,在lz程序中Class obj2= obj1.getClass();
得到obj1的字节码obj2用的就是反射,后根据此字节码对象是否是Array,以及下面的操作。其实反射应用非常广泛,像ssh框架就得用反射完成,远非我们这些小程序可比。
如果lz想了解更多可以到网上搜搜,网上关于这方面的介绍很多,我就不多说了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马