利用反射從XML構造VO

來源:互聯網
上載者:User
xml
    反射使您的程式碼能夠接入裝載到 JVM 中的類的內部資訊,允許你編寫與執行時,而不是原始碼中選定的類協作的代碼。這使反射成為構建靈活的應用的主要工具。        首先觀察下面的 XML 檔案:

 <?xml version = '1.0' encoding = 'gb2312'?><ROOT>   <ARSUBITEM num="1">      <C_ITEMNO>300200500009</C_ITEMNO>      <C_ITEMNAME>20050112測試</C_ITEMNAME>      <C_SUBITEMNO>200543030000010</C_SUBITEMNO>      <C_SUBITEMNAME>20010112標段2</C_SUBITEMNAME>      <C_FUNCNAME>監督備案</C_FUNCNAME>   </ARSUBITEM></ROOT>

    該 XML 檔案描述了一個標段當前流程資訊,接下來把它翻譯成 VO :


 public class BidProcess implements Serializable{

 private String itemNo; private String itemName; private String subItemNo; private String subItemName; private String functionName;

 /**  * @return 返回 functionName。  */ public String getFunctionName() {  return functionName; } /**  * @param functionName 要設定的 functionName。  */ public void setFunctionName(String functionName) {  this.functionName = functionName; } /**  * @return 返回 itemName。  */ public String getItemName() {  return itemName; } /**  * @param itemName 要設定的 itemName。  */ public void setItemName(String itemName) {  this.itemName = itemName; } /**  * @return 返回 itemNo。  */ public String getItemNo() {  return itemNo; } /**  * @param itemNo 要設定的 itemNo。  */ public void setItemNo(String itemNo) {  this.itemNo = itemNo; } /**  * @return 返回 subItemName。  */ public String getSubItemName() {  return subItemName; } /**  * @param subItemName 要設定的 subItemName。  */ public void setSubItemName(String subItemName) {  this.subItemName = subItemName; } /**  * @return 返回 subItemNo。  */ public String getSubItemNo() {  return subItemNo; } /**  * @param subItemNo 要設定的 subItemNo。  */ public void setSubItemNo(String subItemNo) {  this.subItemNo = subItemNo; }}


    從 XML 構造 VO ,放入 List 中,代碼如下:


 public class VOFactory {

 // 構造出的對象集合 private ArrayList list=new ArrayList();  /** 利用反射擷取結果集  */ public List parse(Serializable source, String xml){  try{   //構造 XML 輸入資料流   ByteArrayInputStream ba=new ByteArrayInputStream(xml.getBytes());   //Dom4J 初始化   SAXReader reader = new SAXReader();   Document document = reader.read(ba);   Element root = document.getRootElement();   //獲得類對象   Class c = source.getClass();   //獲得建構函式   Constructor[] cons=c.getDeclaredConstructors();   Constructor con=cons[0];   //獲得類中的欄位   Field[] fields = c.getDeclaredFields();   //設定訪問private欄位的許可權   AccessibleObject.setAccessible(fields,true);   //以特定名稱獲得 XML 元素列表   List lis = root.elements("ARSUBITEM");   //"ARSUBITEM"元素下的子項目   for(int i=0;i<lis.size();i++){    Element element=(Element)lis.get(i);    Iterator iter=element.elementIterator();    //從建構函式執行個體化對象    Serializable localObj=(Serializable)con.newInstance(null);    //按照欄位個數迴圈    int j=0;    while(iter.hasNext()){     Element e=(Element)iter.next();     fields[j].set(localObj,e.getText());     j++;    }    list.add(localObj);   }  }catch(Exception e){   e.printStackTrace();  }  return list; }}


    通過對以上代碼原形進行修改,可實現分頁、結果集嵌套等需求。在寫作本文時,我偶然發現了 Jakarta Commons BeanUtils 也提供了類似的功能。那麼本文就作為一個瞭解反射的範例罷了。


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。