春風(fēng)博客

          春天里,百花香...

          導(dǎo)航

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

          統(tǒng)計(jì)

          公告

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

          Locations of visitors to this page

          常用鏈接

          留言簿(11)

          隨筆分類(lèi)(224)

          隨筆檔案(126)

          個(gè)人軟件下載

          我的其它博客

          我的鄰居們

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          使用反射簡(jiǎn)化繁瑣的對(duì)對(duì)象成員設(shè)值取值的過(guò)程續(xù)

          本文是“使用反射簡(jiǎn)化繁瑣的對(duì)對(duì)象成員設(shè)值取值的過(guò)程”的續(xù)文。

          在前文的例子中,類(lèi)MemberInfo的成員變量都是String類(lèi)型,如果說(shuō)其中有其它類(lèi)型int,boolean等,如果變成下面的類(lèi):
          public class Member{
              
          private String name;
              
          private String title;    
              
          private int age;
              
          private boolean isMale;
          }

          這樣以前的給字段設(shè)置值的方法就不好用了,如之奈何?

          其實(shí)只要肯想,辦法是有的,反射的getField不好用了,我們還有g(shù)etMethod,胡屠戶(hù)死了,咱們也不吃帶毛的豬。通過(guò)反射的getMethod方法,咱們可以得到類(lèi)中定義的函數(shù),再對(duì)類(lèi)的getter、setter函數(shù)動(dòng)動(dòng)手腳就能達(dá)到我們的目的。

          請(qǐng)看代碼,特別是帶注釋的動(dòng)了手腳的函數(shù)部分。
          新定義的Member類(lèi):
          package com.sitinspring;

          public class Member{
              
          private String name;
              
          private String title;    
              
          private int age;
              
          private boolean isMale;
              
              
          public Member(){
              }

              
              
          public Member(String name,String title,int age,boolean isMale){
                  
          this.name=name;
                  
          this.title=title;
                  
          this.age=age;
                  
          this.isMale=isMale;
              }

              
              
          /**
               * 額外增加的從整數(shù)類(lèi)型年齡得到為字符狀態(tài)年齡的函數(shù)
               * 
          @return
               
          */

              
          public String getAge() {
                  
          return String.valueOf(age);
              }

              
              
          /**
               * 額外增加的將字符狀態(tài)年齡轉(zhuǎn)化為整數(shù)類(lèi)型年齡的函數(shù)
               * 
          @param age
               
          */

              
          public void setAge(String age) {
                  
          this.age = Integer.valueOf(age);
              }

              
              
          /**
               * 額外增加的取得字符類(lèi)型性別的函數(shù)
               * 
          @return
               
          */

              
          public String getIsMale() {
                  
          return isMale?"":"";
              }

              
              
          /**
               * 額外增加的將字符類(lèi)型性別轉(zhuǎn)化為布爾類(lèi)型性別的函數(shù)
               * 
          @param strMale
               
          */

              
          public void setIsMale(String strMale) {
                  
          this.isMale = strMale.equals("");
              }

              
              
          /**
               * 改寫(xiě)的函數(shù),將生成的getAge變成了getIntAge
               * 
          @return
               
          */

              
          public int getIntAge() {
                  
          return age;
              }
              
              
              
          public String toString(){
                  
          return "Name="+name+" Title="+title+" Age="+age+" 性別="+getIsMale();
              }


              
          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;
              }


              
          public void setAge(int age) {
                  
          this.age = age;
              }


              
          public boolean isMale() {
                  
          return isMale;
              }


              
          public void setMale(boolean isMale) {
                  
          this.isMale = isMale;
              }

          }

          上面四個(gè)函數(shù)就是為了方便反射而寫(xiě)的,再看MemberPersistence的代碼:
          package com.sitinspring;

          import java.io.File;
          import java.io.FileWriter;
          import java.lang.reflect.Field;
          import java.lang.reflect.Method;
          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;

          /**
           * 用于將Member類(lèi)實(shí)例存到XML文件及從XML文件中取出
           * 
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-1-3
           
          */

          public class MemberPersistence {
              
          // XML 文件名
              private final String xmlFile;

              
          // XML 文檔對(duì)象
              private Document document;

              
          // XML 文檔根節(jié)點(diǎn)
              private Element root;

              
          /**
               * 構(gòu)造函數(shù),其中實(shí)例化文檔對(duì)象和根節(jié)點(diǎn)
               * 
               * 
          @param xmlFile
               
          */

              
          public MemberPersistence(String xmlFile) {
                  
          this.xmlFile = xmlFile;

                  File file 
          = new File(xmlFile);

                  
          try {
                      
          // 判斷文件的存在以增強(qiáng)程序的健壯性
                      if (file.exists()) {
                          
          // 文件存在,直接從文件讀取文檔對(duì)象
                          SAXReader reader = new SAXReader();
                          document 
          = reader.read(file);
                          root 
          = document.getRootElement();
                      }
           else {
                          
          // 文件不存在,創(chuàng)建文檔對(duì)象
                          document = DocumentHelper.createDocument();
                          root 
          = document.addElement("companies");// 創(chuàng)建根節(jié)點(diǎn)
                      }

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

              }


              
          /**
               * 從XML文件中提取所有Member節(jié)點(diǎn)的信息,作為鏈表返回
               * 
               * 
          @return
               
          */

              
          public List<Member> loadFromXml() {
                  List
          <Member> retval = new ArrayList<Member>();

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

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

                          Member member 
          = new Member();

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

                          
          // 設(shè)置每個(gè)成員變量的值
                          for (Field field : fields) {
                              String fieldText 
          = memberElm.elementText(field.getName());

                              
          // 通過(guò)反射取得setter函數(shù)(通過(guò)getSetMethodName函數(shù)得出,參數(shù)為成員名),其參數(shù)為String
                              Method method = member.getClass().getMethod(
                                      getSetMethodName(field.getName()),
                                      
          new Class[] { String.class });

                              
          // 通過(guò)反射調(diào)用setter函數(shù)給成員變量賦值
                              method.invoke(member, new Object[] { fieldText });
                          }


                          retval.add(member);
                      }


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


                  
          return null;
              }


              
          /**
               * 將一個(gè)Member對(duì)象寫(xiě)到XML文件中
               * 
               * 
          @param member
               
          */

              
          public void writeToXml(Member member) {
                  
          try {
                      
          // 在根節(jié)點(diǎn)下增加一個(gè)member節(jié)點(diǎn)
                      Element memberElm = root.addElement("member");

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

                      
          // 取得每個(gè)成員變量的值
                      for (Field field : fields) {
                          
          // 在member節(jié)點(diǎn)下添加屬性節(jié)點(diǎn)
                          Element fieldElm = memberElm.addElement(field.getName());

                          
          // 通過(guò)反射取得getter函數(shù)(通過(guò)getGetMethodName函數(shù)得出,參數(shù)為成員名),其參數(shù)無(wú)
                          Method method = member.getClass().getMethod(
                                  getGetMethodName(field.getName()), 
          new Class[] {});

                          
          // 通過(guò)反射調(diào)用getter函數(shù)給取得成員變量的值
                          Object result = method.invoke(member, new Object[] {});

                          
          // 將此值賦給節(jié)點(diǎn)文字
                          fieldElm.setText((String) result);
                      }


                      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();
                  }

              }


              
          /**
               * 取得“getter”函數(shù)的函數(shù)名
               * 
               * 
          @param field
               * 
          @return
               
          */

              
          private static String getGetMethodName(String field) {
                  
          return "get" + field.substring(01).toUpperCase() + field.substring(1);
              }


              
          /**
               * 取得“setter”函數(shù)的函數(shù)名
               * 
               * 
          @param field
               * 
          @return
               
          */

              
          private static String getSetMethodName(String field) {
                  
          return "set" + field.substring(01).toUpperCase() + field.substring(1);
              }

          }


          最后的調(diào)用處還是和上篇差不多:
          package com.sitinspring;

          import java.util.List;

          public class Main{
              
          public static void main(String[] args){        
                  MemberPersistence persistence
          =new MemberPersistence("member.xml");
                  
                  
          // 1.寫(xiě)入過(guò)程
                  Member andy=new Member("Andy","SSE",25,true);
                  Member bill
          =new Member("Bill","PM",26,false);    
                  persistence.writeToXml(andy);
                  persistence.writeToXml(bill);
                  
                  
          // 2.讀出過(guò)程
                  List<Member> members=persistence.loadFromXml();
                  
          for(Member member:members){
                      System.out.println(member);
                  }

              }

          }

          生成的文件:
          <?xml version="1.0" encoding="GBK"?>

          <companies>
            
          <member>
              
          <name>Andy</name>
              
          <title>SSE</title>
              
          <age>25</age>
              
          <isMale></isMale>
            
          </member>
            
          <member>
              
          <name>Bill</name>
              
          <title>PM</title>
              
          <age>26</age>
              
          <isMale></isMale>
            
          </member>
          </companies>

          代碼下載(請(qǐng)自行加入dom4j包):
          http://www.aygfsteel.com/Files/sitinspring/MemberMethodSetgetValueSample20080105151118.rar

          posted on 2008-01-05 15:10 sitinspring 閱讀(2335) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): Java基礎(chǔ)

          評(píng)論

          # re: 使用反射簡(jiǎn)化繁瑣的對(duì)對(duì)象成員設(shè)值取值的過(guò)程續(xù) 2008-01-06 04:39 thinkbase

          需要嗎? xstream 不是就可以了么  回復(fù)  更多評(píng)論   

          # re: 使用反射簡(jiǎn)化繁瑣的對(duì)對(duì)象成員設(shè)值取值的過(guò)程續(xù) 2008-01-06 11:17 qiyadeng

          對(duì)的, xstream,可以幫你完成。  回復(fù)  更多評(píng)論   

          # re: 使用反射簡(jiǎn)化繁瑣的對(duì)對(duì)象成員設(shè)值取值的過(guò)程續(xù) 2008-01-06 14:16 Jeff Lau

          BeanUtils類(lèi)也可以實(shí)現(xiàn)這樣類(lèi)似的功能啊  回復(fù)  更多評(píng)論   

          sitinspring(http://www.aygfsteel.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
          主站蜘蛛池模板: 宣化县| 大名县| 石阡县| 鄂伦春自治旗| 盐池县| 四川省| 湖南省| 嘉义县| 平度市| 大英县| 玉林市| 湘乡市| 广东省| 双流县| 蓬安县| 甘孜县| 潞城市| 正蓝旗| 建德市| 鞍山市| 高台县| 田东县| 大城县| 五台县| 治县。| 运城市| 江津市| 鄂伦春自治旗| 丹东市| 邵东县| 元江| 岳西县| 靖边县| 鄂伦春自治旗| 桃江县| 嘉义市| 扎鲁特旗| 五常市| 乐昌市| 获嘉县| 上蔡县|