春風博客

          春天里,百花香...

          導航

          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統計

          公告

          MAIL: junglesong@gmail.com
          MSN: junglesong_5@hotmail.com

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(224)

          隨筆檔案(126)

          個人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          使用反射簡化繁瑣的對對象成員設值取值的過程

          轉載請注明作者sitinspring及出處.

          對對象字段設值取值是一個繁瑣的過程,尤其當字段多時更加如此,也許大家都寫過如下代碼:
              public void savePersonalInfo(PersonalInfo info) {
                  Element infoElm 
          = root.addElement("personalinfo");
                  
                  
          // 一個蘿卜一個坑
                  Element nameElm = infoElm.addElement("name");
                  nameElm.setText(info.getName());

                  Element sexElm 
          = infoElm.addElement("sex");
                  sexElm.setText(info.getSex());

                  Element mobileElm 
          = infoElm.addElement("mobile");
                  mobileElm.setText(info.getMobile());

                  Element phoneElm 
          = infoElm.addElement("phone");
                  phoneElm.setText(info.getPhone());

                  Element addressElm 
          = infoElm.addElement("address");
                  addressElm.setText(info.getAddress());

                  Element emailElm 
          = infoElm.addElement("email");
                  emailElm.setText(info.getEmail());

                  Element titleElm 
          = infoElm.addElement("title");
                  titleElm.setText(info.getTitle());

                  Element birthdayElm 
          = infoElm.addElement("birthday");
                  birthdayElm.setText(info.getBirthday());

                  Element homepageElm 
          = infoElm.addElement("homepage");
                  homepageElm.setText(info.getHomepage());

                  Element qqElm 
          = infoElm.addElement("qq");
                  qqElm.setText(info.getQq());

                  Element msnElm 
          = infoElm.addElement("msn");
                  msnElm.setText(info.getMsn());

          }

          這是取值過程,設值過程還要把上面繁瑣的過程重復一遍,工作顯得瑣碎而沒有技術含量.

          在反射的幫助下,我們可以有效的簡化這個繁瑣的過程,看代碼之前我們先補充一點有關類字段的反射API:
          ●Field[] getDeclaredFields():返回已加載類聲明的所有成員變量的Field對象數組,不包括從父類繼承的成員變量.
          ●Field getDeclaredField(String name):返回已加載類聲明的所有成員變量的Field對象,不包括從父類繼承的成員變量,參數name指定成員變量的名稱.
          ●Field[] getFields():返回已加載類聲明的所有public型的成員變量的Field對象數組,包括從父類繼承的成員變量
          ●Field getField(String name):返回已加載類聲明的所有成員變量的Field對象,包括從父類繼承的成員變量,參數name指定成員變量的名稱.

          例程如下,假設我們是對一個名為MemberInfo的對象進行操作,它的代碼如下:
          package com.sitinspring;

          public class MemberInfo{
              
          private String name;
              
          private String title;
              
          private String address;
              
              
          public MemberInfo(){
              }
              
              
          public MemberInfo(String name,String title,String address){
                  
          this.name=name;
                  
          this.title=title;
                  
          this.address=address;
              }
              
              
          public String toString(){
                  
          return "Name="+name+" Title="+title+" Address="+address;
              }

              
          public String getAddress() {
                  
          return address;
              }

              
          public void setAddress(String address) {
                  
          this.address = address;
              }

              
          public String getName() {
                  
          return name;
              }

              
          public void setName(String name) {
                  
          this.name = name;
              }

              
          public String getTitle() {
                  
          return title;
              }

              
          public void setTitle(String title) {
                  
          this.title = title;
              }
          }

          現在有一個MemberPersistence類,負責將MemberInfo類實例存到XML文件及從XML文件中取出,注意看設值取值的過程:
          package com.sitinspring;

          import java.io.File;
          import java.io.FileWriter;
          import java.lang.reflect.Field;
          import java.util.ArrayList;
          import java.util.Iterator;
          import java.util.List;

          import org.dom4j.Document;
          import org.dom4j.DocumentHelper;
          import org.dom4j.Element;
          import org.dom4j.io.OutputFormat;
          import org.dom4j.io.SAXReader;
          import org.dom4j.io.XMLWriter;

          /**
           * 用于將MemberInfo類實例存到XML文件及從XML文件中取出
           * 
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-1-3
           
          */
          public class MemberPersistence {
              
          // XML 文件名
              private final String xmlFile;

              
          // XML 文檔對象
              private Document document;

              
          // XML 文檔根節點
              private Element root;

              
          /**
               * 構造函數,其中實例化文檔對象和根節點
               * 
          @param xmlFile
               
          */
              
          public MemberPersistence(String xmlFile) {
                  
          this.xmlFile = xmlFile;

                  File file 
          = new File(xmlFile);

                  
          try {
                      
          // 判斷文件的存在以增強程序的健壯性
                      if (file.exists()) {
                          
          // 文件存在,直接從文件讀取文檔對象
                          SAXReader reader = new SAXReader();
                          document 
          = reader.read(file);
                          root 
          = document.getRootElement();
                      } 
          else {
                          
          // 文件不存在,創建文檔對象
                          document = DocumentHelper.createDocument();
                          root 
          = document.addElement("companies");// 創建根節點
                      }
                  } 
          catch (Exception ex) {
                      ex.printStackTrace();
                  }
              }

              
          /**
               * 從XML文件中提取所有Member節點的信息,作為鏈表返回
               * 
               * 
          @return
               
          */
              
          public List<MemberInfo> loadFromXml() {
                  List
          <MemberInfo> retval = new ArrayList<MemberInfo>();

                  
          try {
                      List nodes 
          = root.elements("member");

                      
          for (Iterator it = nodes.iterator(); it.hasNext();) {
                          Element memberElm 
          = (Element) it.next();

                          MemberInfo member 
          = new MemberInfo();

                          
          // 取得MemberInfo類的所有定義的成員變量,注意DeclaredFields不包括繼承下來的成員變量
                          Field[] fields = member.getClass().getDeclaredFields();

                          
          // 設置每個成員變量的值
                          for (Field field : fields) {
                              String fieldText 
          = memberElm.elementText(field.getName());
                              
          // 必須設置為true才可以取得成員變量的值,否則field.set(member, fieldText)一句要拋出java.lang.IllegalAccessException異常
                              field.setAccessible(true);
                              field.set(member, fieldText);
                          }

                          retval.add(member);
                      }

                      
          return retval;
                  } 
          catch (Exception ex) {
                      ex.printStackTrace();
                  }

                  
          return null;
              }

              
          /**
               * 將一個Member對象寫到XML文件中
               * 
               * 
          @param member
               
          */
              
          public void writeToXml(MemberInfo member) {
                  
          try {
                      
          // 在根節點下增加一個member節點
                      Element memberElm = root.addElement("member");

                      
          // 取得MemberInfo類的所有定義的成員變量,注意DeclaredFields不包括繼承下來的成員變量
                      Field[] fields = member.getClass().getDeclaredFields();

                      
          // 取得每個成員變量的值
                      for (Field field : fields) {
                          
          // 在member節點下添加屬性節點
                          Element fieldElm = memberElm.addElement(field.getName());
                          
          // 必須設置為true才可以取得成員變量的值,否則field.get(member)一句要拋出java.lang.IllegalAccessException異常
                          field.setAccessible(true);
                          fieldElm.setText((String) field.get(member));
                      }

                      OutputFormat format 
          = OutputFormat.createPrettyPrint();
                      format.setEncoding(
          "GBK"); // 指定XML編碼
                      XMLWriter writer = new XMLWriter(new FileWriter(xmlFile), format);

                      writer.write(document);
                      writer.close();
                  } 
          catch (Exception ex) {
                      ex.printStackTrace();
                  }
              }
          }
          最后測試代碼:
          package com.sitinspring;

          import java.util.List;

          public class Main{
              
          public static void main(String[] args){        
                  MemberPersistence persistence
          =new MemberPersistence("member.xml");
                  
                  
          // 1.寫入過程
                  MemberInfo andy=new MemberInfo("andy","SSE","Street A No 123");
                  MemberInfo bill
          =new MemberInfo("Bill","PM","Street B No 456");    
                  persistence.writeToXml(andy);
                  persistence.writeToXml(bill);
                  
                  
          // 2.讀出過程
                  List<MemberInfo> members=persistence.loadFromXml();
                  
          for(MemberInfo member:members){
                      System.out.println(member);
                  }
              }
          }
          生成和讀出的XML文件如下:
          <?xml version="1.0" encoding="GBK"?>

          <companies>
            
          <member>
              
          <name>andy</name>
              
          <title>SSE</title>
              
          <address>Street A No 123</address>
            
          </member>
            
          <member>
              
          <name>Bill</name>
              
          <title>PM</title>
              
          <address>Street B No 456</address>
            
          </member>
          </companies>

          看,結果是我們想要的,設值取值也變得輕巧起來,比原先一個蘿卜一個坑的方式要先進多了.

          代碼下載(請大家自行加入dom4j包):
          http://www.aygfsteel.com/Files/sitinspring/MemberFieldSetgetValueSample20080103135538.rar

          posted on 2008-01-03 13:49 sitinspring 閱讀(858) 評論(0)  編輯  收藏 所屬分類: Java基礎

          sitinspring(http://www.aygfsteel.com)原創,轉載請注明出處.
          主站蜘蛛池模板: 灌南县| 屯昌县| 广宗县| 临湘市| 柘城县| 双辽市| 苏尼特右旗| 万全县| 三明市| 托里县| 会理县| 通渭县| 永顺县| 九龙坡区| 鹰潭市| 惠来县| 乌什县| 屏东市| 栾川县| 鹤壁市| 许昌市| 铜山县| 莒南县| 利津县| 东阳市| 嘉义市| 永平县| 恩施市| 连州市| 清水河县| 林西县| 丹棱县| 普兰店市| 大石桥市| 沙湾县| 牙克石市| 汝州市| 岑巩县| 涿鹿县| 神池县| 神农架林区|