一、介绍
1、简介
BeanWrapper是Spring中一个很重要的接口,Spring在通过配信息创建对象时,第一步首先就是创建一个BeanWrapper。
Spring低级JavaBeans基础设施的中央接口。通常来说并不直接使用BeanWrapper,而是借助BeanFactory或者DataBinder来一起使用,BeanWrapper对Spring中的Bean做了包装,为的是更加方便的操作Bean中的属性。
2、继承关系
3、Java中的内置机制
首先可以先了解下JavaBean的概念:一种特殊的类,主要用于传递数据信息。这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规范。如果两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为"值对象"(Value Object),或"VO"。
因此JavaBean都有如下几个特征:
- 属性都是私有的
- 有无参的public构造方法
- 对私有属性根据需要提供公有的getXxx方法以及setXxx方法
- getters必须有返回值没有方法参数,setter没有返回值,有方法参数
符合这些特征的类,被称为JavaBean,JDK提供了一套API用来访问某个属性的getter/setter方法,这些API存放在java.beans中,这就是内省(Introspector)。
4、内省和反射的区别
反射:java反射机制是在运行中,对任意一个类,能够获取得到这个类的所有属性和方法,它针对的是任意类。
内省:是java语言对JavaBean类属性,事件的处理方法。
- 反射可以操作各种类的属性,而内省只是通过反射来操作JavaBean的属性
- 内省设置属性值肯定会调用setter方法,反射可以不用(反射可以直接操作属性Field)
- 反射就像镜子,然后能看到.class的所有,是客观的事实。内省更像主观的判断:比如看到getName(),内省就会认为这个类中有name字段,但事实上并不一定会有name。通过内省可以获取bean的getter/setter
二、定义
1、PropertyDescriptor
属性描述符,能够描述JavaBean中的属性,通过属性描述符我们能知道这个属性的类型,获取操纵属性的方法(getter/setter)
三、demo
1、获取对象原值与设置新值
@Testpublic void user(){UserDTO userDTO = UserDTO.builder().age(18).id("1").name("zs").build();BeanWrapperImpl beanWrapper = new BeanWrapperImpl(userDTO);PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {String fieldName = propertyDescriptor.getName();Object fieldValue = beanWrapper.getPropertyValue(fieldName);log.info("old:fieldName={},fieldValue={}", fieldName, fieldValue);//重新设置值if(!"class".equals(fieldName) && fieldValue instanceof String){beanWrapper.setPropertyValue(fieldName, "new"+fieldValue);}}log.info("new userDTO={}",userDTO);}
执行输出:
2024-06-27T17:18:01.278+08:00 INFO 53196 --- [ main] com.example.bean.UserTest : old:fieldName=age,fieldValue=18
2024-06-27T17:18:01.279+08:00 INFO 53196 --- [ main] com.example.bean.UserTest : old:fieldName=class,fieldValue=class org.example.bean.dto.UserDTO
2024-06-27T17:18:01.280+08:00 INFO 53196 --- [ main] com.example.bean.UserTest : old:fieldName=id,fieldValue=1
2024-06-27T17:18:01.280+08:00 INFO 53196 --- [ main] com.example.bean.UserTest : old:fieldName=name,fieldValue=zs
2024-06-27T17:18:01.280+08:00 INFO 53196 --- [ main] com.example.bean.UserTest : new userDTO=UserDTO(id=new1, name=newzs, age=18)