内省和BeanUtil

Posted xing-chen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内省和BeanUtil相关的知识,希望对你有一定的参考价值。

什么是内省?

内省(Introspector)是Java语言对JavaBean类属性、事件的处理方法。

Java提供了一套API来访问某个属性的getter/setter方法,这些API存放在java.beans中

主要的类和方法

Introspector类:

主要方法:用于获取BeanInfo 对象

BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);

Beaninfo类

PropertyDescriptor[] pd2 = beanInfo.getPropertyDescriptors();

PropertyDescriptor类:

这个类可以直接new,代表对象的单个属性

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

或者通过beaninfo获取属性的列表,然后用for-each遍历

PropertyDescriptor[] pd2 = beanInfo.getPropertyDescriptors();

PropertyDescriptor类表示JavaBean类通过存储器导出一个属性。主要方法:
1. getPropertyType(),获得属性的Class对象;
2. getReadMethod(),获得用于读取属性值的方法;

3. getWriteMethod(),获得用于写入属性值的方法;
4. hashCode(),获取对象的哈希值;
5. setReadMethod(Method readMethod),设置用于读取属性值的方法;
6. setWriteMethod(Method writeMethod),设置用于写入属性值的方法

和反射的区别

技术分享图片

 反射可以操作各种类的属性,而内省只是通过反射来操作JavaBean的属性

 内省设置属性值肯定会调用seter方法,反射可以不用

BeanUtil

内省操作非常的繁琐,所以所以Apache开发了一套简单、易用的API来操作Bean的属性——BeanUtils工具包。

常用操作

1.对属性赋值和获取

BeanUtils.setProperty(p, "name", "张三");

BeanUtils.getProperty(p, "name")

2.把一个javaBean的属性拷贝到另一个javaBean对象中

//需求:把s1的属性值拷贝到S2中,注意参数的顺序      

BeanUtils.copyProperties(s2, s1);

3.把一个map集合中的数据拷贝到javaBean中

BeanUtils.copyProperties(s, map);

BeanUtils自动将字符串转换为基本类型,但是非基本类型需要自定义类型转换器

PropertyUtils类和BeanUtils不同在于,运行getProperty、setProperty操作时,没有类型转换,使用属性的原有类型或者包装类。由于age属性的数据类型是int,所以方法PropertyUtils.setProperty(userInfo,"age", "8")会爆出数据类型不匹配,无法将值赋给属性。

自定义类型转换器

beanutil有时需要自定义类型转换器,将字符串转入相应的类型如String---》Date

ConvertUtils.register(new Converter(){ 
@SuppressWarnings("unchecked")
@Override
public <T> T convert(Class<T> type, Object value) { 
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
                String sbirthday = (String) value; 
try { 
return (T) sdf.parse(sbirthday); 
                } catch (ParseException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
return null; 
          } 
         }               
    }, java.util.Date.class);

 






以上是关于内省和BeanUtil的主要内容,如果未能解决你的问题,请参考以下文章

反射,内省,BeanUtil的区别

C++ 和序列化:有啥方法可以进行某种内省吗?

JavaBeans与内省(Introspector)

BeanUtil 好用的工具类

BeanUtil拷贝

Java内省