黑马程序员——操纵javabean的两种方式

来源:互联网 发布:csgo 性能数据 编辑:程序博客网 时间:2024/06/01 10:44

----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------

 

一、内省操作javabean的属性

 

一个字段只有向外提供了相对应的getset方法,才是属性。属性不是由privateString name决定,而是由个体或set方法决定的。

每一个类中都是继承Object类的,所以都有一个getClass方法,所以都有class属性。像下面这个类,就总共有5个属性:

    publicclass Person {

        private String name;

        private String password;

        private int age;

        private Date birthday;

        public Date getBirthday() {

              returnbirthday;

        }

        public void setBirthday(Date birthday) {

              this.birthday= birthday;

        }

        public String getName() {

              returnname;

        }

        public String getPassword() {

              returnpassword;

        }

        public int getAge() {

              returnage;

        }

        public void setName(String name) {

              this.name= name;

        }

        public void setPassword(String password) {

              this.password= password;

        }

        public void setAge(int age) {

              this.age= age;

        }

}

内省,到底省哪个Bean,可以调用它的getBeanInfo(ClassbeanClass)传入参数指定,省完存入一个BeanInfo对象中。然后可以调用getPropertyDescriptors()方法获取到bean的所有属性的属性描述器PropertyDescriptor。进而可以调用这个属性描述器的getWriteMethod()getReadMethod()方法来获取该Bean的写入属性值的方法(setXXX)和读取属性值的方法(getXXX)。具体代码如下(可以得到bean所有属性):

        public void test1() throws IntrospectionException{

               //调用getBeanInfo方法,将Person的字节码对象传入,指定省Person

               BeanInfoinfo=Introspector.getBeanInfo(Person.class);

               //调用getPropertyDescriptors方法,得到bean所有属性的属性描述器对象

               PropertyDescriptor[] pds=info.getPropertyDescriptors();

               for(PropertyDescriptorpd:pds){//遍历属性描述器对象中的所有属性

                    System.out.println(pd.getName());//打印出各个属性的名称

               }

        }

打印出来的结果为ab age class name password五个对象名称;

 

如果只想获取Person类自己定义的属性,不想获取从父类Object类继承而来的属性,可以调用Introspector.getBeanInfo(Person.class,Object.class)获取,在原来的基础上传入多一个Object.class

 

如果只想操纵bean的指定属性,不想操纵所有属性的话,可以使用PropertyDescriptor类的另外的构造函数来指定获取的是具体哪一个属性。

        public void test2() throws Exception{

                  Person p=new Person();

                  //指定要操纵的是Person类的age属性

                  PropertyDescriptor pd=new PropertyDescriptor("age",Person.class);

                  //得到属性的写方法,为属性赋值

                  Method method=pd.getWriteMethod();

                  method.invoke(p, 45);

                  System.out.println(p.getAge());//45

                  //获取属性的值

                  method=pd.getReadMethod();

                  System.out.println(method.invoke(p, null));//打印结果一样为45

        }

如果不知道当前操作的属性是什么类型,可以用以下方法:

        public void test3() throws Exception{

                  Person p=new Person();

                  PropertyDescriptor pd=new PropertyDescriptor("age",Person.class);

                  //调用getPropertyType()方法获取属性类型。

                  System.out.println(pd.getPropertyType());

        }

 

二、beanUtils操纵javabean

 

beanUtils不属于sun公司开发的类,是由第三方提供的用于处理javabeanAPI。使用beanUtils操纵javabean可以有很多方便的地方。例如:

 

1、可以直接调用setProperty方法设置Person类中某个属性的值;

Person p=newPerson();

BeanUtils.setProperty(p,"age", 456);

 

2beanUtils支持8种基本类型自动转换;

Stringpassword="pw";

Person p=newPerson();

//可以自动将String类型转换为int类型

BeanUtils.setProperty(p,"password", password);

System.out.println(p.getPassword());//pw

 

3、对于不属于8种数据类型的转换,beanUtils提供了转换工具类CovertUtils,它有注册转换器的register方法。示例代码如下:

 

Stringbirthday="1983-12-1";

//为了让日期赋值到beanbirthday属性上,给beanUtils注册一个日期转换器

ConvertUtils.register(newConverter(){

        //复写Converter接口的抽象方法,

        public Object convert(Class type, Object value) {

                  if(value==null) return null;

                  if(!(value instanceof String)){

                           throw new ConversionException("只支持String类型的转换");

                }

                String str=(String)value;

                  //防止用户提交空格数据

                if(str.trim().equals("")) returnnull;

                SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");

                try {

                       returndf.parse(str);

                } catch (ParseException e) {

                      throw new RuntimeException(e);                                    

                }

        }}, Date.class);//指定为什么类型数据注册的转换器

 

其实,beanUntils中已经提供了很多接口Converter的实现类,其中就有用于日期转换器。比如DateLocaleConverter本地日期转换器。所以上面的代码可以直接写成ConvertUtils.register(newDateLocaleConverter (),Date.class)

 

4、有时候数据是以键值对的map集合形式存在的,这种情况做法应该如下:

Map map=newHashMap();

map.put("name","aaa");

map.put("password","123");

map.put("brithday","1980-09-09");

ConvertUtils.register(newDateLocaleConverter(), Date.class);

Person p=newPerson();

//使用populate方法,用map集合填充bean属性

//这个时候要注意map关键字和bean属性一定要一致

BeanUtils.populate(p,map);

 

 

----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!----------------------

 详细请查看:http://edu.csdn.net