普通JavaBean的Property(域/类变量)的命名规则

时间:2022-06-15 19:07:27

转自:http://chanson.iteye.com/blog/419028

 

1、背景

本文讲的普通JavaBean只是一个拥有Property(域/类变量)及其setter/getter的普通Java类。

有一定Java开发经验的人可能会知道,普通JavaBean的Property(域/类变量)的命名不能采用以下形式:aA***或者Aa***,如:"aDdress"或"Address",否则,在web应用中会报无法找到这个Property(因为根据"规则",需要找的是"ADdress"或"address")。但对于其中的原因,一般人都不明白,难道这是Sun公司当初定的规范吗?

Java开源以后,我们终于可以解开其中的谜:

 

2、普通JavaBean处理涉及到相关类

在web应用中,Servlet容器或者EJB容器一般会使用java.beans包中的类来加载这些JavaBean。

BeanInfo(接口)
   |
SimpleInfo(类)
   |
GenericBeanInfo(类)

GenericBeanInfo是JavaBean数据装载类。
Introspector是JavaBean处理中最重要的一个处理类。
另外的一些辅助类,就不一一列举了。

 

3、解密

3.1 开始

在应用中,我们通常会用以下代码来获取一个普通JavaBean相关的信息:
BeanInfo mBeanInfo = null;
try {
 mBeanInfo = Introspector.getBeanInfo(Person.class);
} catch (IntrospectionException e) {
 e.printStackTrace();
}

3.2 深入
在Introspector类的getBeanInfo方法中,我们发现其中与Property处理相关的行:
private GenericBeanInfo getBeanInfo()
        throws IntrospectionException {
        ……
        PropertyDescriptor apropertydescriptor[] = getTargetPropertyInfo();
        ……
    }

3.3 继续深入
在Property处理方法中,我们发现其处理方式是根据getter/setter的方法来得到Property(域/类变量)
private PropertyDescriptor[] getTargetPropertyInfo() throws IntrospectionException{
   ……
 if(s.startsWith("get")) obj = new PropertyDescriptor(decapitalize(s.substring(3)), method, null);
 ……
}

3.4 关键
接下来,最关键的就是下面这个方法:
 public static String decapitalize(String s)
    {
        if(s == null || s.length() == 0)
            //空处理
            return s;

        if(s.length() > 1 && Character.isUpperCase(s.charAt(1)) && Character.isUpperCase(s.charAt(0))){
            //长度大于1,并且前两个字符大写时,返回原字符串
            return s;
        } else{
            //其他情况下,把原字符串的首个字符小写处理后返回
            char ac[] = s.toCharArray();
            ac[0] = Character.toLowerCase(ac[0]);
            return new String(ac);
        }
    }

4 Ending
解密完成。
明白真相,才会解开心中的锁——其实很简单。