「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
1.简介
它是一个属性访问控制器,主要控制bean属性的存取。他有一个非常重要的子接口 BeanWrapper (主要是Spring 在创建bean时会用到,这个需要单独花时间,另讲)。后续方法为了演示方便,统一使用 BeanWrapperImpl,具体在别的实现类中,执行结果可能不同,因为这个比较重要 所以以他为准。
主要实现类如下图:
2. 属性
- 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. 方法
3.1 boolean isReadableProperty(String propertyName)
- 作用:确定指定的属性是否可读。若属性不存在 返回false
- 演示类:
- 演示结果:
- 扩展? 何为可读的,get方法私有化结果如何
- 修改 getName() 方法为private,执行刚刚的代码查看结果
- 若把main 方法 放到Student 类 执行结果会变化嘛?
- 修改 getName() 方法为private,执行刚刚的代码查看结果
- 可读性 总结,只有当该属性的get方法修饰符是公有的,(哪怕属性是公有的也不算可读)
3.2 boolean isWritableProperty(String propertyName)
-
作用:判断属性是否可写。若属性不存在 返回false。
-
演示类:
-
演示结果:
-
可写性: 即属性的 set方法 修饰符为 public
3.3 Class<?> getPropertyType(String propertyName) throws BeansException;
- 作用:确定指定属性的类型,若属性不存在返回null
- 演示类: 同上
- 演示结果:
3.4 TypeDescriptor getPropertyTypeDescriptor(String propertyName) throws BeansException;
- 作用:返回指定属性的类型描述符,若属性不存在,返回null
- TypeDescriptor类型:主要包含下图这些数据
- 演示结果:
3.5 Object getPropertyValue(String propertyName) throws BeansException;
- 作用: 返回指定属性的值,若属性的getter 方法 不是
public或 属性不存在,则直接抛异常。 - 演示类:
- 演示结果:
- 总结 :再调此方法前,可以先调 isReadableProperty()方法,防止抛出异常。
3.6 void setPropertyValue(String propertyName, @Nullable Object value) throws BeansException;
- 作用:这个方法的作用主要是给指定属性赋值的,若该属性的setter 方法修饰符不是
public则抛出异常 - 演示类:
- 演示结果:
3.7 后面的 setPropertyValue()
作用和 3.6 方法一样,只不过设置值的方式不同。