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

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

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

    春風(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)

    隨筆分類(224)

    隨筆檔案(126)

    個(gè)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

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

    轉(zhuǎn)載請(qǐng)注明作者sitinspring及出處.

    對(duì)對(duì)象字段設(shè)值取值是一個(gè)繁瑣的過(guò)程,尤其當(dāng)字段多時(shí)更加如此,也許大家都寫過(guò)如下代碼:
        public void savePersonalInfo(PersonalInfo info) {
            Element infoElm 
    = root.addElement("personalinfo");
            
            
    // 一個(gè)蘿卜一個(gè)坑
            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());

    }

    這是取值過(guò)程,設(shè)值過(guò)程還要把上面繁瑣的過(guò)程重復(fù)一遍,工作顯得瑣碎而沒(méi)有技術(shù)含量.

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

    例程如下,假設(shè)我們是對(duì)一個(gè)名為MemberInfo的對(duì)象進(jìn)行操作,它的代碼如下:
    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;
        }
    }

    現(xiàn)在有一個(gè)MemberPersistence類,負(fù)責(zé)將MemberInfo類實(shí)例存到XML文件及從XML文件中取出,注意看設(shè)值取值的過(guò)程:
    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類實(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<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不包括繼承下來(lái)的成員變量
                    Field[] fields = member.getClass().getDeclaredFields();

                    
    // 設(shè)置每個(gè)成員變量的值
                    for (Field field : fields) {
                        String fieldText 
    = memberElm.elementText(field.getName());
                        
    // 必須設(shè)置為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;
        }

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

                
    // 取得MemberInfo類的所有定義的成員變量,注意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());
                    
    // 必須設(shè)置為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();
            }
        }
    }
    最后測(cè)試代碼:
    package com.sitinspring;

    import java.util.List;

    public class Main{
        
    public static void main(String[] args){        
            MemberPersistence persistence
    =new MemberPersistence("member.xml");
            
            
    // 1.寫入過(guò)程
            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.讀出過(guò)程
            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>

    看,結(jié)果是我們想要的,設(shè)值取值也變得輕巧起來(lái),比原先一個(gè)蘿卜一個(gè)坑的方式要先進(jìn)多了.

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

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

    sitinspring(http://www.tkk7.com)原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處.
    主站蜘蛛池模板: 亚洲真人无码永久在线| 91成人在线免费视频| 特级一级毛片免费看| 亚洲A∨精品一区二区三区下载| 亚洲欧美日韩中文字幕一区二区三区| 亚洲av专区无码观看精品天堂| 亚洲视频精品在线观看| 亚洲精品视频免费看| 亚洲成AV人综合在线观看| 亚洲最新在线视频| 亚洲精品福利你懂| 亚洲欧美精品午睡沙发| 亚洲日韩AV一区二区三区四区 | 午夜男人一级毛片免费| 成年丰满熟妇午夜免费视频| 我要看免费的毛片| 日韩高清在线高清免费| 又爽又高潮的BB视频免费看| 亚洲国产精品一区二区三区久久| 国产成人精品久久亚洲高清不卡 | 国产亚洲?V无码?V男人的天堂 | 女人张开腿给人桶免费视频| 国产午夜影视大全免费观看| 亚洲中文无韩国r级电影 | 日日操夜夜操免费视频| 免费一级做a爰片性色毛片| 国产综合精品久久亚洲| 婷婷亚洲综合五月天小说| 亚洲人成电影在线观看网| 亚洲丶国产丶欧美一区二区三区| 老牛精品亚洲成av人片| 香蕉免费看一区二区三区| 无码av免费网站| 狼友av永久网站免费观看| 亚洲午夜av影院| 久久久久亚洲精品天堂| 亚洲老熟女五十路老熟女bbw | 精品亚洲成A人无码成A在线观看| 亚洲AV无码资源在线观看| 久久免费香蕉视频| 黄在线观看www免费看|