<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乱码一区二区三区按摩| 亚洲综合国产一区二区三区| 手机在线免费视频| 日本高清高色视频免费| 丰满亚洲大尺度无码无码专线| 久久亚洲免费视频| 亚洲v国产v天堂a无码久久| xx视频在线永久免费观看| 深夜福利在线视频免费| 亚洲人色大成年网站在线观看| 亚洲A∨午夜成人片精品网站| 久久久久久精品免费免费自慰| 丰满妇女做a级毛片免费观看| 激情综合亚洲色婷婷五月| 国产精品亚洲а∨无码播放| 日韩高清免费在线观看| 亚洲w码欧洲s码免费| a级毛片高清免费视频就| 亚洲狠狠婷婷综合久久蜜芽| 亚洲免费视频网站| 久久久久亚洲AV综合波多野结衣| 成人免费激情视频| 无码中文字幕av免费放dvd| 一级午夜a毛片免费视频| 亚洲av中文无码乱人伦在线观看 | 一本色道久久综合亚洲精品高清| 又粗又大又黑又长的免费视频| 免费国产99久久久香蕉| 人人鲁免费播放视频人人香蕉| 亚洲av成人一区二区三区观看在线 | 亚洲av最新在线观看网址|