1. 程式人生 > >解密:普通JavaBean的Property(域/類變數)的命名規則

解密:普通JavaBean的Property(域/類變數)的命名規則



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
解密完成。
明白真相,才會解開心中的鎖——其實很簡單。