JAVA源码解析(6)-java.beans.PropertyDescriptor
来源:互联网 发布:淘宝网羽绒服女款套装 编辑:程序博客网 时间:2024/04/28 18:58
Jdk版本:1.8.0_131
作者出于学习阶段,如有问题请指正
来自API的解释:PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
PropertyDescriptor有一个常用的功能:包装一个属性的Get、Set方法,通过反射调取相应的方法,举例:
构造一个PropertyDescriptor -> 获取get/set方法 -> invoke
在整个PropertyDescriptor中,有两个重要的概念:readMethod和writeMethod,理解起来,可以当做是目前流行的Get方法和Set方法
目前有如下构造器:
构造器中,若传入了Class,则会验证class,否则会忽略classPropertyDescriptor(String propertyName, Class<?> beanClass)默认传入的readMethod和writeMethod为:is+属性名/set+属性名PropertyDescriptor(String propertyName, Class<?> beanClass, String readMethodName, String writeMethodName)默认构造器PropertyDescriptor(String propertyName, Method readMethod, Method writeMethod)忽略了class的包装propertyName的构造器,目前用的比较多的也是这个PropertyDescriptor(Class<?> bean, String base, Method read, Method write)base和propertyName的区别是,当前构造器会调用Introspector.decapitalize(base)方法来设置属性名
Introspector.decapitalize方法:
public static String decapitalize(String name) { if (name == null || name.length() == 0) { return name; } if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) && Character.isUpperCase(name.charAt(0))){ return name; } char chars[] = name.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); }
看不懂的话看下示例:
name -> name
Name ->name
nAme -> nAme
NAME -> NAME
getPropertyType/setPropertyType方法:
getPropertyType返回属性的Java类型信息。注意Class对象可能会描述原始Java类型,例如int。 这种类型是由read方法返回的,或者用作write方法的参数类型。 如果类型是不支持非索引访问的索引属性,则返回null。
public synchronized Class<?> getPropertyType() { Class<?> type = getPropertyType0(); if (type == null) { try { type = findPropertyType(getReadMethod(), getWriteMethod()); setPropertyType(type); } catch (IntrospectionException ex) { // Fall } } return type; }
findPropertyType方法如下:
private Class<?> findPropertyType(Method readMethod, Method writeMethod) throws IntrospectionException { Class<?> propertyType = null; try { if (readMethod != null) { Class<?>[] params = getParameterTypes(getClass0(), readMethod); if (params.length != 0) { throw new IntrospectionException("bad read method arg count: " + readMethod); } propertyType = getReturnType(getClass0(), readMethod); if (propertyType == Void.TYPE) { throw new IntrospectionException("read method " + readMethod.getName() + " returns void"); } } if (writeMethod != null) { Class<?>[] params = getParameterTypes(getClass0(), writeMethod); if (params.length != 1) { throw new IntrospectionException("bad write method arg count: " + writeMethod); } if (propertyType != null && !params[0].isAssignableFrom(propertyType)) { throw new IntrospectionException("type mismatch between read and write methods"); } propertyType = params[0]; } } catch (IntrospectionException ex) { throw ex; } return propertyType; }
该类的使用案例:http://blog.csdn.net/z6913787/arti/8443777
关键的代码没问题,其余的方法没有太多可以说的地方,如有不懂的地方请及时留言
阅读全文
0 0
- JAVA源码解析(6)-java.beans.PropertyDescriptor
- JAVA源码解析(5)-java.beans.MethodDescriptor、java.beans.MethodRef
- JAVA源码解析(2)-java.beans.FeatureDescriptor、
- JAVA源码解析(3)-java.beans.BeanDescriptor
- JAVA源码解析(4)-java.beans.EventSetDescriptor
- JAVA源码解析(7)-java.beans.IndexedPropertyDescriptor
- JAVA源码解析(8)-java.beans.PersistenceDelegate
- JAVA源码解析(9)-java.beans.DefaultPersistenceDelegate
- JAVA源码解析(1)-java.beans.Beans、ObjectInputStreamWithLoader、BeansAppletContext、BeansAppletStu
- JAVA源码解析(10)-java.beans.Encoder、java.beans.MetaData、java.beans.ExceptionListener
- java PropertyDescriptor 应用及源码分析
- JAVA源码解析(11)-java.beans.XMLEncoder、java.beans.XMLDecoder(一)
- Java中PropertyDescriptor用法
- java beans
- Java Beans
- Java Beans
- Java Beans
- Java Beans
- 利用Python、openCV打造自己的人脸识别AI系统
- jsoup加载CSDN分页后文章目录
- 什么是面向对象编程
- vue.js权威指南-第一章 遇见 vue.js
- 使用rxjava2实现界面跳转
- JAVA源码解析(6)-java.beans.PropertyDescriptor
- 中断服务子程序 ISR
- oracle视图
- 异常
- c++中关于图的最小生成树的Kruskal算法的实现
- css超出两行省略号,超出一行省略号
- JS 数组对象去重
- Android应用中如何调用系统闹钟及日历
- 多文件上传(HTTP)