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

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

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

    春風博客

    春天里,百花香...

    導航

    <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.tkk7.com/Files/sitinspring/MemberFieldSetgetValueSample20080103135538.rar

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

    sitinspring(http://www.tkk7.com)原創,轉載請注明出處.
    主站蜘蛛池模板: 日韩免费一区二区三区在线播放| 九九久久国产精品免费热6 | 一级一级一片免费高清| 韩国欧洲一级毛片免费| 色噜噜噜噜亚洲第一| 免费a级毛片无码av| 一级特黄色毛片免费看| 亚洲日本乱码在线观看| 久久永久免费人妻精品下载| 久久精品a亚洲国产v高清不卡| 8x成人永久免费视频| 亚洲18在线天美| 在线观看免费国产视频| 高潮毛片无遮挡高清免费视频| 亚洲乱码中文字幕手机在线| 中文无码成人免费视频在线观看 | 免费A级毛片无码无遮挡内射| 亚洲一级毛片在线播放| 日本免费中文字幕在线看| 二级毛片免费观看全程| 亚洲成AV人片在线观看ww| 美女视频黄a视频全免费| 午夜亚洲国产理论片二级港台二级| 亚洲A∨精品一区二区三区| 99免费在线视频| 亚洲大尺码专区影院| 国产一区二区免费在线| 99视频在线观看免费| 亚洲狠狠成人综合网| 国产成人精品久久亚洲| 久久综合给合久久国产免费 | 亚洲a视频在线观看| 国产在线播放免费| 国产免费爽爽视频在线观看| 亚洲伊人久久大香线蕉| 亚洲国产aⅴ综合网| 99久久99热精品免费观看国产| 亚洲久热无码av中文字幕| 亚洲韩国精品无码一区二区三区 | 激情内射亚洲一区二区三区| 免费无码又爽又刺激毛片|