spring 中 PropertAccessor 简介

388 阅读2分钟

「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

1.简介

它是一个属性访问控制器,主要控制bean属性的存取。他有一个非常重要的子接口 BeanWrapper (主要是Spring 在创建bean时会用到,这个需要单独花时间,另讲)。后续方法为了演示方便,统一使用 BeanWrapperImpl,具体在别的实现类中,执行结果可能不同,因为这个比较重要 所以以他为准。

主要实现类如下图: 图片.png

2. 属性

图片.png

  • String NESTED_PROPERTY_SEPARATOR = "." :嵌套属性的路径分隔符。遵循正常的Java约定:比如 "foo.bar"是getFoo().getBar()。
  • char NESTED_PROPERTY_SEPARATOR_CHAR = '.' : 同上,这不过这个是char类型的
  • String PROPERTY_KEY_PREFIX = "[" : 表示属性键开始的标记,如索引等 persion.friends[0]。
  • char PROPERTY_KEY_PREFIX_CHAR = '[' : 同上
  • String PROPERTY_KEY_SUFFIX = "]" :表示属性键结束的标记,如索引等。
  • char PROPERTY_KEY_SUFFIX_CHAR = ']':同上

3. 方法

图片.png

3.1 boolean isReadableProperty(String propertyName)

  • 作用:确定指定的属性是否可读。若属性不存在 返回false
  • 演示类: 图片.png
  • 演示结果: 图片.png
  • 扩展? 何为可读的,get方法私有化结果如何
    1. 修改 getName() 方法为private,执行刚刚的代码查看结果 图片.png
    2. 若把main 方法 放到Student 类 执行结果会变化嘛? 图片.png
  • 可读性 总结,只有当该属性的get方法修饰符是公有的,(哪怕属性是公有的也不算可读)

3.2 boolean isWritableProperty(String propertyName)

  • 作用:判断属性是否可写。若属性不存在 返回false。

  • 演示类:

    图片.png

  • 演示结果: 图片.png

  • 可写性: 即属性的 set方法 修饰符为 public

3.3 Class<?> getPropertyType(String propertyName) throws BeansException;

  • 作用:确定指定属性的类型,若属性不存在返回null
  • 演示类: 同上
  • 演示结果: 图片.png

3.4 TypeDescriptor getPropertyTypeDescriptor(String propertyName) throws BeansException;

  • 作用:返回指定属性的类型描述符,若属性不存在,返回null
  • TypeDescriptor类型:主要包含下图这些数据 图片.png
  • 演示结果: 图片.png

3.5 Object getPropertyValue(String propertyName) throws BeansException;

  • 作用: 返回指定属性的值,若属性的getter 方法 不是 public 或 属性不存在,则直接抛异常。
  • 演示类: 图片.png
  • 演示结果: 图片.png
  • 总结 :再调此方法前,可以先调 isReadableProperty()方法,防止抛出异常。

3.6 void setPropertyValue(String propertyName, @Nullable Object value) throws BeansException;

  • 作用:这个方法的作用主要是给指定属性赋值的,若该属性的setter 方法修饰符不是 public 则抛出异常
  • 演示类: 图片.png
  • 演示结果: 图片.png

3.7 后面的 setPropertyValue()

作用和 3.6 方法一样,只不过设置值的方式不同。