<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è)人軟件下載

    我的其它博客

    我的鄰居們

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    使用反射簡化繁瑣的對對象成員設(shè)值取值的過程續(xù)

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

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

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

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

    請看代碼,特別是帶注釋的動(dòng)了手腳的函數(shù)部分。
    新定義的Member類:
    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ù)類型年齡得到為字符狀態(tài)年齡的函數(shù)
         * 
    @return
         
    */

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

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

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

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

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

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

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

        
        
    /**
         * 改寫的函數(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ù)就是為了方便反射而寫的,再看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類實(shí)例存到XML文件及從XML文件中取出
     * 
     * 
    @author: sitinspring(junglesong@gmail.com)
     * @date: 2008-1-3
     
    */

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

        
    // XML 文檔對象
        private Document document;

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

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

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

            File file 
    = new File(xmlFile);

            
    try {
                
    // 判斷文件的存在以增強(qiáng)程序的健壯性
                if (file.exists()) {
                    
    // 文件存在,直接從文件讀取文檔對象
                    SAXReader reader = new SAXReader();
                    document 
    = reader.read(file);
                    root 
    = document.getRootElement();
                }
     else {
                    
    // 文件不存在,創(chuàng)建文檔對象
                    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類的所有定義的成員變量,注意DeclaredFields不包括繼承下來的成員變量
                    Field[] fields = member.getClass().getDeclaredFields();

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

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

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


                    retval.add(member);
                }


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


            
    return null;
        }


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

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

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

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

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

                    
    // 通過反射調(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.寫入過程
            Member andy=new Member("Andy","SSE",25,true);
            Member bill
    =new Member("Bill","PM",26,false);    
            persistence.writeToXml(andy);
            persistence.writeToXml(bill);
            
            
    // 2.讀出過程
            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>

    代碼下載(請自行加入dom4j包):
    http://m.tkk7.com/Files/sitinspring/MemberMethodSetgetValueSample20080105151118.rar

    posted on 2008-01-05 15:10 sitinspring 閱讀(2329) 評論(3)  編輯  收藏 所屬分類: Java基礎(chǔ)

    評論

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

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

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

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

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

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

    sitinspring(http://m.tkk7.com)原創(chuàng),轉(zhuǎn)載請注明出處.
    主站蜘蛛池模板: 2022久久国产精品免费热麻豆| 国产成人亚洲毛片| 一区二区三区免费在线视频 | 4hu四虎最新免费地址| 亚洲综合熟女久久久30p| 亚洲gay片在线gv网站| 日本h在线精品免费观看| 亚洲色婷婷综合久久| 亚洲激情在线观看| 特级aaaaaaaaa毛片免费视频| a国产成人免费视频| 国产又大又黑又粗免费视频 | 综合在线免费视频| 亚洲av最新在线网址| 又粗又长又爽又长黄免费视频| 最近高清国语中文在线观看免费| 亚洲M码 欧洲S码SSS222| 亚洲人成人77777网站不卡| 中文字幕无码一区二区免费| 4338×亚洲全国最大色成网站| 亚洲Av永久无码精品黑人| 免费国产污网站在线观看| 亚洲视频在线精品| 美女羞羞喷液视频免费| 暖暖免费高清日本一区二区三区| 亚洲人成网站日本片| 99免费在线观看视频| 亚洲AV无码成人专区片在线观看 | 大地影院MV在线观看视频免费| 亚洲日本中文字幕一区二区三区| 激情小说亚洲色图| 永久久久免费浮力影院| 亚洲色偷精品一区二区三区| 中文字幕无码视频手机免费看| 亚洲人成激情在线播放| 久久免费看黄a级毛片 | 亚洲一区二区三区亚瑟| 国产精品永久免费视频| 亚洲国产精品专区在线观看| 曰批免费视频播放在线看片二| 18禁止观看免费私人影院|