什么是内省?
内省(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);
原文地址:https://www.cnblogs.com/xing-chen/p/8809855.html