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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 57xiaoyu 中级黑马   /  2015-4-6 12:30  /  541 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 57xiaoyu 于 2015-4-6 12:34 编辑

JavaBean
JavaBean是一种特殊的符合一种特殊书写方式的Java类。JavaBean的属性可以由get和set方法推断得到。get和set方法的名称书写规范是get+JavaBean的属性名、set+JavaBean的属性名。这个类的成员变量(与JavaBean的属性名不是一回事)起什么名字无所谓,因为成员变量是私有的,外界看不到。

下面的例子里定义了一个Person类,它有一个age属性。这个类就符合JavaBean的书写规范,可以看成是一个JavaBean。

我们可以知道这个类有一个setAge方法和一个getAge方法。由于它是一个JavaBean,所以我们就可以从方法名字中提取出它的属性名。

public class Person {
        //成员变量
        private int x;
        //set方法
        public void setAge(int age){
                x = age;
        }
        //get方法
        public int getAge(){
                return x;
        }
}

javaBean的应用:
在开发中,我们经常需要将一个模块中的数据传递到另一个模块中去,我们就把这些传递的数据当成一个JavaBean来处理。这种JavaBean类的实例化对象称为值对象VO(Value Object)。

Introspector内省
下面我们用内省的方式操作JavaBean
首先我们先定义一个JavaBean类
public class Person {
        private int x;
        private int y;
        Person(){}
        public Person(int age, int height){
                this.x = age;
                this.y = height;
        }
        public int getAge() {
                return x;
        }
        public void setAge(int age) {
                this.x = age;
        }
        public int getHeight() {
                return y;
        }
        public void setHeight(int height) {
                this.y = height;
        }
}

我们只知道这个类的属性名,存放在一个字符串中,我们要得到它的值,必须要先把它转化为get方法的名字,然后通过方法的反射调用获得它的值。内省用它的一套办法简化了上面这个操作。
下面用内省的方式操作JavaBean。
获取age的值
                //创建对象
                Person p1 = new Person(24,178);
                //对象的属性名存在字符串中
                String propertyName = "age";
                //把Person作为JavaBean,通过内省的方法操作JavaBean
                PropertyDescriptor pd = new PropertyDescriptor(propertyName, p1.getClass());
                //得到Person对应属性名的get方法
                int retVal = (int)pd.getReadMethod().invoke(p1);
                //打印
                System.out.println(retVal);
修改height的值
                //属性名
                String propertyName2 = "height";
                //内省的方式操作javaBean
                PropertyDescriptor pd2 = new PropertyDescriptor(propertyName2, p1.getClass());
                //获得对应属性的set方法,反射方式调用
                pd2.getWriteMethod().invoke(p1, 180);

另外一种较为复杂的获取值的实现方法:(读取类似)
                BeanInfo beanInfo = Introspector.getBeanInfo(p1.getClass());
                PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
                Object retVal = null;
                for(PropertyDescriptor pd : pds){
                        if(pd.getName().equals(propertyName)){
                                retVal = (Object)pd.getReadMethod().invoke(p1);
                                break;
                        }
                }
                System.out.println(retVal);

BeanUtils工具包
apache为JavaBean的操作提供了BeanUtils工具包,简化操作。
BeanUtils工具包需要到apache官网下载,而且还需要一个logging的工具包。
下面是用BeanUtils对JavaBean进行get和set,注意虽然age的值是int类型,但是我们我们需要传入字符串类型
                //set
                BeanUtils.setProperty(p1,"age","35");
                //get
                System.out.println(BeanUtils.getProperty(p1, "age"));
如果一个JavaBean对象的属性又是一个JavaBean对象,我们可以用属性级联的方式对其进行get和set。
假设上面的age是Date()类型的,Date()有一个方法是setTime(),也就是有一个time的属性,那么:

                //set
                BeanUtils.setProperty(p1,"age.time","35");
                //get
                System.out.println(BeanUtils.getProperty(p1, "age.time"));

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马