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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM王琦 中级黑马   /  2013-8-18 11:05  /  2749 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内省是专门用来操作get和set属性的,可已通过内省来获取和设置属性值。

创建类的对象就调用get和set方法就可以获取和设置属性值啊,那么为什么还用内省来操作呢?感觉还麻烦一些。。。

6 个回复

倒序浏览
内省机制很强大
回复 使用道具 举报

我知道,内省机制很强大。我困惑的就是那点。。。
回复 使用道具 举报
到实际开发估计就能体会到了
回复 使用道具 举报
首先,你需要明白反射和内省是动态加载和功能扩展。
第二,在大型的商业web服务中,程序一般是不中断的,必须长期运行,停止程序几分钟也损失不少。
第三,当你的大型商业web服务程序需要更新和功能扩展时,你是不可能经常重启程序,重新整个程序编译,再重启服务。这样费时,并且会导致损失惨重。
所以你需要动态加载形式的功能扩展。
第四,内省是将传统的get set 默认规则 操作 封装出一套具有动态加载操作属性的API(java.beans)
通过内省获得属性描述器,然后通过这个属性描述器就可以获取某个属性对应的getter/setter方法,最后我们就可以通过反射机制来调用这些方法。
这俩 一体的,关键要明白动态加载。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
1、javaBean实现Serializable接口   
2、javaBean是一个编程规范,要求你的变量是private,而用set/get来取值。然后java通过自省来取值和赋值

一个JavaBean类可以不当JavaBean用,而当成普通类用。JavaBean实际就是一种规范,当一个类满足这个规范,这个类就能被其它特定的类调用。一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。去掉set前缀,然后取剩余部分,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。下面就用前面的讲解的反射方式来设置或读取JavaBean的属性:
private static void setObjectProperty(ReflectPoint pt1, int value,String propName) throws IntrospectionException, IllegalAccessException, InvocationTargetException {
            /*BeanInfo bean = Introspector.getBeanInfo(ReflectPoint.class);
            PropertyDescriptor [] properties = bean.getPropertyDescriptors();
            for(PropertyDescriptor property: properties)
            {
                if(property.getName().equals(propName))
                {
                    Method mSetX = property.getWriteMethod();
                    mSetX.invoke(pt1, value);
                    break;
                }
            }*/
            PropertyDescriptor property = new PropertyDescriptor("x",ReflectPoint.class);
            Method mSetX = property.getWriteMethod();
            mSetX.invoke(pt1, value);
        }
    代码中注释的语句代表一种方式,最后的三行代表另外一种设置相应类相应属性的方式。从简洁上来说,第二种方式显然更优雅。第一种方式中首先是获得相应javaBean的类信息bean,用的BeanInfo这个类来描述的。然后就能够通过getPropertyDescriptors方法获取属性描述数组对象。最后从数组中取去一个个的属性对象进行操作——获取相应的读写方法,然后调用相应的读写方法。这些是通过反射机制做到的。由于这种方式比较麻烦,如果只调用其中一种方法,就要遍历一次属性描述数组,所以就产生了第二种方式,直接通过传入属性名称,相应的javaBean类型参数,构造出一个需要的PropertyDescriptor对象,然后再进行调用。

张孝祥老师的基础加强视频讲得很详细,希望能帮到你!

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
楼主好,你说的情况是在是你知道要获取的对象的情况下的属性才可以直接用get和set方法。
当你编写框架的时候所面向的对象是不确定的,属性值也就跟着不确定,只能用变量来表示对象和对象的属性值,这时候只能通过内存的方式来获取get和set方法了,可能这样说有点模糊,建议把张老师的视频多看看,通透的理解面向对象的思想。希望我的回答对你能有所帮助

评分

参与人数 1黑马币 +3 收起 理由
田磊阳 + 3

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马