歡迎使用CSDN-markdown編輯器

Experience Java的屬性變量名前兩個字母大小寫問題

Java屬性命名規範!
一般情況下。Java的屬性變量名都已小寫字母開頭,如:userName,showMessage等,但也存在着特殊情況,考慮到一些特定的有意思的英文縮略詞如(USA,XML等),JavaBean也允許大寫字母起頭的屬性變量名,不過必須滿足“變量的前兩個字母要麼全部大寫,要麼全部小寫”的要求,如:IDCode、ICCard、idCode等屬性變量名是合法的,而iC、iCcard、iDCode等屬性變量名是非法的。正是由於這個原因造成了下面這種情況:
舉個例子:
JavaBean

public class RegionDTO  implements Serializable{
    public String cId;
    public String getCid() {
        return cid;
    }
    public void setCid(String cid) {
        this.cid = cid;
    }
    public String cName;    

    public String getCName() {
        return cName;
    }
    public void setCName(String name) {
        cName = name;
    }

}

封裝成List後,然後在頁面上用C標籤進行顯示

${item.cId}//報錯 RegionDTO沒有這個屬性!!!  

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章