一.引言

     昨天同事反馈热配置的值一直赋值不上去,之前也是这样操作的,按道理没有问题。今天有时间就看了下源码。

二.分析

     首先交代一下代码场景:一个类(A)里面设置了三个字段 KFC,MyTest,age(这三个字段都是我随便取的),其中,KFC,age两个字段都已经获取到了值,而MyTest这个字段没有值。

     怎么办?只能一步一步的追代码了。

一个字段首字母大小写引发空值

重点:看到类里面的字段名变成了myTest,“M”-->“m”

进一步分析:

BeanUtils.getPropertyDescriptors(clazz);

发现这一步,字段的名称就已经变了.

最后定位到

public static String decapitalize(String name) {  
    if (name == null || name.length() == 0) {
        return name;
    }
    //重点:这里在判断字段属性名第一个和第二个都是大写的时候,才会将该字段返回,所以KFC值是可以赋上的
    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]);  //将第一个字符小写, MyTest在里面变成了myTest
    return new String(chars);
}

好了,方便大家查看此问题,给一下主要的调用链

1.BeanUtils.getPropertyDescriptors(clazz)
2.CachedIntrospectionResults cr = CachedIntrospectionResults.forClass(clazz);
3.results = new CachedIntrospectionResults(beanClass);
4.Introspector.getBeanInfo(beanClass)
5.beanInfo = new Introspector(beanClass, null, USE_ALL_BEANINFO).getBeanInfo();
6.PropertyDescriptor pds[] = getTargetPropertyInfo();
7.pd = new PropertyDescriptor(this.beanClass, name.substring(3), method, null);
8.setName(Introspector.decapitalize(base));

以上主要列了8步,纸上得来终觉浅,绝知此事要躬行!

三.解决

1.将类里面的字段设置为myTest,第一个字母小写也是符合java规范的。

2.改变判断逻辑,自己获取类的字段名,jdk中有现成的方法,这样可以避免框架里面的坑!


相关文章:

  • 2021-11-21
  • 2021-07-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-19
猜你喜欢
  • 2022-12-23
  • 2021-06-04
  • 2021-04-30
  • 2022-12-23
  • 2022-12-23
  • 2021-12-28
相关资源
相似解决方案