jdk获取属性名称注意事项
来源:互联网 发布:家具有味怎么办知乎 编辑:程序博客网 时间:2024/06/05 05:13
最近在JDK1.8环境下 使用Introspector获取bean属性名以及类型信息等(PropertyDescriptor),用于将Map内的元素赋值给bean属性时,遇到有特殊属性无论如何也无法赋值的情况。故查看了jdk该方法的实现细节,现将代码标记如下:
获取bean属性信息代码:PropertyDescriptor[] props = Introspector.getBeanInfo(desBeanClazz).getPropertyDescriptors();
执行流程大致为:Introspector->getBeanInfo->new GenericBeanInfo->getTargetPropertyInfo->new PropertyDescriptor->setName(Introspector.decapitalize(base))
我们看到属性名的关键在于:setName(Introspector.decapitalize(base))
于是查看Introspector.decapitalize(String name)方法的具体实现:
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); }该方法在第二个if判断时,判断如果name第一和第二个字母为大写,则直接返回name,否则将name首字母转为小写返回name。
我们再来查看decapitalize方法的name来源:
截取getTargetPropertyInfo()关键代码
String name = method.getName(); if (name.startsWith(GET_PREFIX)) { // Simple getter pd = new PropertyDescriptor(this.beanClass, name.substring(3), method, null);}可以看到属性名是根据bean的get方法名去掉前三位之后转换而来。如果我们的属性名是 qTitle,那么对应的get方法名为getQTitle,decapitalize方法获取到的属性名将会是QTitle,故无法成功赋值。
我们查看decapitalize方法的注释:
/** * Utility method to take a string and convert it to normal Java variable * name capitalization. This normally means converting the first * character from upper case to lower case, but in the (unusual) special * case when there is more than one character and both the first and * second characters are upper case, we leave it alone. * <p> * Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays * as "URL". * * @param name The string to be decapitalized. * @return The decapitalized version of the string. */
大意是说该方法会将字符串转为java变量名的格式,通常情况下的做法是将首字母小写,但是当首字母和第二个字母都是大写时,则不做此转换。
由此,我们可以得知jdk对于java属性名命名时,并不推荐qTitle这样的命名格式。望后来者若要命名第一个字母小写第二个字母大写的属性名时,一定要慎重。
- jdk获取属性名称注意事项
- C# 获取xml属性名称
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值 .
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- java获取Object属性类型、属性名称、属性值
- java获取对象属性类型、属性名称、属性值
- 利用反射获取类的属性名称
- 算法编程题1-二叉树的按层遍历(含换行)
- 优秀程序员眼中的整洁代码
- 正则表达式的基本用法
- 8.3 E
- Nodejs笔记(1)——ECMAScript
- jdk获取属性名称注意事项
- WebRTC系列(3):PeerConnection通信建立流程
- mybatis 抛出 Mapped Statements collection does not contain value for 异常
- 第三方App接入微信登录 解读
- C++ bitset类的使用与简介
- 经典测试实践分享——以太网交换机性能测试需要关注的细节
- UML时序图
- 内存调试工具electric-fence 使用(各种架构方法类似)
- HDOJ 6085-Kanade's sum