小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

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

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

對(duì)對(duì)象字段設(shè)值取值是一個(gè)繁瑣的過(guò)程,尤其當(dāng)字段多時(shí)更加如此,也許大家都寫(xiě)過(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)類(lèi)字段的反射API:
●Field[] getDeclaredFields():返回已加載類(lèi)聲明的所有成員變量的Field對(duì)象數(shù)組,不包括從父類(lèi)繼承的成員變量.
●Field getDeclaredField(String name):返回已加載類(lèi)聲明的所有成員變量的Field對(duì)象,不包括從父類(lèi)繼承的成員變量,參數(shù)name指定成員變量的名稱(chēng).
●Field[] getFields():返回已加載類(lèi)聲明的所有public型的成員變量的Field對(duì)象數(shù)組,包括從父類(lèi)繼承的成員變量
●Field getField(String name):返回已加載類(lèi)聲明的所有成員變量的Field對(duì)象,包括從父類(lèi)繼承的成員變量,參數(shù)name指定成員變量的名稱(chēng).

例程如下,假設(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類(lèi),負(fù)責(zé)將MemberInfo類(lèi)實(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類(lèi)實(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類(lèi)的所有定義的成員變量,注意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ì)象寫(xiě)到XML文件中
     * 
     * 
@param member
     
*/
    
public void writeToXml(MemberInfo member) {
        
try {
            
// 在根節(jié)點(diǎn)下增加一個(gè)member節(jié)點(diǎn)
            Element memberElm = root.addElement("member");

            
// 取得MemberInfo類(lèi)的所有定義的成員變量,注意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.寫(xiě)入過(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./Files/sitinspring/MemberFieldSetgetValueSample20080103135538.rar

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多