<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
    對對象字段設值取值是一個繁瑣的過程,尤其當字段多時更加如此,也許大家都寫過如下代碼:
        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.tkk7.com/Files/sitinspring/MemberFieldSetgetValueSample20080103135538.rar
    posted on 2008-05-23 12:52 rogerfan 閱讀(462) 評論(3)  編輯  收藏 所屬分類: 【Java知識】

    Feedback

    # re: 【轉】使用反射簡化繁瑣的對對象成員設值取值的過程 2008-05-23 13:28 如坐春風
    轉文章別忘了提提作者啊 :)  回復  更多評論
      

    # re: 【轉】使用反射簡化繁瑣的對對象成員設值取值的過程 2008-05-23 17:33 々上善若水々
    不錯,收藏了.  回復  更多評論
      

    # re: 【轉】使用反射簡化繁瑣的對對象成員設值取值的過程 2008-05-23 17:52 rogerfan
    @如坐春風
    呵呵,不好意思,忘記了,本文出處:如坐春風   回復  更多評論
      

    主站蜘蛛池模板: 日韩免费视频播放| 一级特黄录像视频免费| 99国产精品免费视频观看| 亚洲国产精品碰碰| 国产亚洲精品欧洲在线观看| 精品国产免费观看一区| 亚洲av无码一区二区三区在线播放 | 在线看片无码永久免费aⅴ| 亚洲色偷偷色噜噜狠狠99| AV片在线观看免费| 亚洲国产精华液2020| 精品免费国产一区二区| 国产亚洲精品美女| 亚洲精品无码永久中文字幕| 97在线免费观看视频| 亚洲综合久久综合激情久久| 120秒男女动态视频免费| 亚洲人配人种jizz| 小小影视日本动漫观看免费| 黄色免费网址大全| 亚洲国产精华液网站w| 啦啦啦完整版免费视频在线观看 | 97人妻精品全国免费视频| 亚洲av综合色区| 曰曰鲁夜夜免费播放视频| 亚洲gay片在线gv网站| 久久久久亚洲爆乳少妇无 | 成人午夜免费福利视频| 亚洲视频无码高清在线| 亚洲欧洲中文日韩av乱码| 日韩人妻无码精品久久免费一| 亚洲综合校园春色| 免费A级毛片无码久久版| 国产麻豆一精品一AV一免费| 国产成+人+综合+亚洲专| 亚洲成av人片不卡无码久久| 污视频在线免费观看| 亚洲AV色欲色欲WWW| 亚洲中文字幕久久精品无码APP | 久久高潮一级毛片免费| 亚洲成a人片在线观|