熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

struts源代碼閱讀(Commons-Beanutils包)

2013-11-23 20:32:25  來源: Java開源技術 

  CommonsBeanutils(一)
  
  CommonsBeanutils 這個是jakarta commons項目中的一個子項目這個項目開發的目的是幫助開發者動態的獲取/設值Java Bean的屬性同時解決每次都要寫getXXX和setXXX的麻煩
  
  XXXConvert
  
  這些類都實現Converter接口提供把value值轉化成為相應XXX類的實現現在只針對四種類型數字時間Boolean和String在Converter 接口中只有一個方法convert(Class type Object value)把value對象轉換為type所要求的類XXXConvert類中這個方法的思路是
  
  如果value==null並且自己內部有缺省的值那麼就返回這個缺省的值如果沒有缺省值就拋出ConversionException異常
  
  如果value instanceOf XXX類那麼就直接返回value
  
  如果上面的都不行那麼調用new XXX(valuetoString())或者XXXvalueOf(valuetoString())方法來返回轉化失敗時拋出ConversionException異常
  
  特殊的實現
  
  對於ClassConverter類當進入第三種情形的時候實際執行的是
  
  ClassLoader classLoader =ThreadcurrentThread()getContextClassLoader();  if (classLoader == null) {    classLoader = ClassConverterclassgetClassLoader();  }  return (classLoaderloadClass(valuetoString()));
  
  對於BooleanConverter類當進入第三種情形的時候實際執行的是根據valuetoString()的值yesytrue on 返回truenonfalseoff 返回false如果這些情形都不符合並且有缺省值的時候則返回缺省值否則拋出ConversionException
  
  XXXArrayConverter
  
  這些類繼承自AbstractArrayConverter類 AbstractArrayConverter 實際只實現了一個List parseElements(String svalue)方法這個方法接受的是{value value}格式的字符串逐個解析出來後放入一個ArrayList中它通過StreamTokenizer解析字符串StreamTokenizer是用來分離input stream中讀取的字符串並且可以根據標記區分不同的內容比如數字字符或者注釋XXXArrayConverter由於要轉換的是一個數組所以convert()方法的實現過程有所不同
  
  如果value==null並且自己內部有缺省的值那麼就返回這個缺省的值如果沒有缺省值就拋出ConversionException異常
  
  如果modelgetClass() == valuegetClass()那麼就直接返回value
  
  如果上面的都不行那麼就通過parseElements(valuetoString())生成一個數組再對數組的元素逐個調用new XXX(listget(i))或者XXXvalueOf(listget(i))方法轉換成為數組對元素要求的類型轉化失敗時拋出ConversionException異常
  
  CommonsBeanutils(二)
  
  LocaleConverter 與 BaseLocaleConverter
  
  LocaleConverter繼承自 Converter接口定義了一個新方法convert(Class type Object value String pattern)
  
  抽象類BaseLocaleConverter實現了LocaleConverter接口它的locPattern屬性用來表示這個對象的pattern是否是本地化的格式patttern 是指把何種格式的時間或者數字值轉換成標准值convert()的執行過程是
  
  如果value==null並且自己內部有缺省的值那麼就返回這個缺省的值如果沒有缺省值就拋出ConversionException異常
  
  根據參數pattern值是否為null調用parse(Object value String pattern)方法如果這個參數不為null那麼就使用這個參數的值否則使用對象預存的pattern值如果這
  
  樣做引起了異常會首先判斷是否能夠返回缺省的值不能則拋出ConversionException異常
  
  parse(Object value String
  
  pattern)方法的實現被拋至繼承了它的類具體實現這個方法雖然把value值表述為Object類型但是最後都是通過強制轉換轉換成為String類型也就是說它實際上需要的
  
  是String類型的value
  
   XXXLocaleConverter
  
  把pattern格式的value轉換成標准格式的相應的XXX類這些類可以分為兩大類一類為時間一類為數值
  
  時間類最後都會通過SimpleDateFormat類對值進行轉換程序如下
  
  if(pattern == null) {       pattern = locPattern ? new SimpleDateFormat()toLocalizedPattern() :         new SimpleDateFormat()toPattern();  }  SimpleDateFormat format = new SimpleDateFormat(pattern locale);  if (locPattern) {    formatterapplyLocalizedPattern(pattern);  }else {    formatterapplyPattern(pattern);  }  return formatterparse((String) value);
  
  數值類最後都會通過DecimalFormat類對值進行轉換程序如下
  
  DecimalFormat formatter = (DecimalFormat) DecimalFormatgetInstance(locale);  if (pattern != null) {    if (locPattern) {      formatterapplyLocalizedPattern(pattern);    } else {      formatterapplyPattern(pattern);    }  }  return formatterparse((String) value);
  
  這個轉化過程要注意精度的問題由於Number類是所有的數值類的父類所以轉換完成後要檢查最後的結果是否是當前要求的精度如果大於所要求的精度則拋出ConversionException異常
  
  CommonsBeanutils(三)
  
  Dyna開頭的類是專門為DynaFormBean而設計的
  
  DynaBeanDynaClass 與 DynaProperty
  
  DynaBean並不是Java中所定義的Bean而是一種的Bean因為它並不是通過getXXX和setXXX方法對XXX屬性進行取值和設值的它通過一個實現了DynaClass接口的類幫助管理其所有的屬性的類別而自己則管理對XXX屬性值的設定和獲取在設值的時候會通過與name對應的DynaProperty對象檢查賦值的類別是否正確
  
  DynaProperty類描述的是DynaBean中所包含的屬性的類型DynaProperty類有三個屬性屬性的名稱name屬性的名稱type屬性的類別contentType如果DynaProperty描述的是個容器對象(List或者Map)那麼這個contentType就代表這個容器內元素的類別這個類值得關注的地方是writeObject和readObject方法的實現它會首先判斷自己的type是否是一個primitive的類如果是則先寫入true標志再寫入對應的primitive類的編號否則寫入false標志再寫入type因為在調用readObject方法時如果得出的是primitive類型則type的值為XXXTYPE而不是XXXclass
  
  DynaClass 是一個接口用來管理DynaBean中所有的DynaProperty屬性
  
  BasiceDyanBean 與 BasicDynaClass
  
  BasiceDyanBean 實現自DynaBean接口它包含一個實現了DynaClass接口的類的對象和一個用來存放值的HashMap這個HashMap的key與DynaClass中HashMap的key是一一對應的
  
  BasicDynaClass 實現了DynaClass接口以DynaProperty的name為key保存所有這些DynaProperty對象它通過newInstance方法動態生成實現了DynaBean接口的類的對象注意這個類是可以動態指定的如果沒有那麼就是默認的BasicDynaBean類動態指定類是通過反射實現的程序如下
  
  //dynaBeanClass為任意的實現了DynaBean接口的類constructorTypes為這個
  
  //類的構造方法所需要的參數的類型
  
  constructor = dynaBeanClassgetConstructor(constructorTypes);
  
  //constructorValues為構造方法的參數值實際上它的值為當前的BasicDynaClass
  
  return ((DynaBean) constructornewInstance(constructorValues));
  
  CommonsBeanutils(四)
  
  ConvertUtils 和 ConvertUtilsBean
  
  ConvertUtils 是ConvertUtilsBean類的一個簡單封裝即ConvertUtils中的所有方法都是通過直接調用ConvertUtilsBean中的同名方法實現的如果你需要更復雜的功能就使用ConvertUtilsBean否則使用ConvertUtils
  
  ConvertUtilsBean 通過一個HashMap管理所有的XXXConverter這個HashMap的key為XXX的類全名值為相應的XXXConverter對象通過deregister()方法初始化這個HashMap這個初始化方法會為每一個XXXConverter類提供一個缺省的值用戶可以動過setDefaultXXX()方法來自行設置XXXConverter對象的缺省值這個類還提供了convert()方法對String value進行相應的轉化
  
  PropertyUtils 和 PropertyUtilsBean
  
  PropertyUtils 是PropertyUtilsBean類的一個簡單封裝同樣它的所有方法都是通過直接調用PropertyUtilsBean 中同名方法實現的
  
  PropertyUtilsBean 對DynaBean或者一個java標准Bean中的屬性動態的賦值和取值(非通過getXXX和setXXX方法)
  
  這個類支持多層嵌套比如XXX[i]YYY(key)ZZZ那麼它會為你得到或者設置ZZZ的屬性
  
  所有的set/get方法介紹
  
  //對XXX(key)格式的name設值
  
  setMappedProperty(Object bean String nameString key Object value)
  
  //對XXX[i]格式的name設值
  
  setIndexed
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28632.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.