Jakarta Commnos lang學習

ReflectionToStringBuilder

ReflectionToStringBuilder類是用來實現類中的toString()方法的類,它採用Java反射機制(Reflection),

通過reflection包中的AccessibleObject類繞過訪問控制而直接存取對象的私有成員。

因此在使用該類時,要注意運行環境的安全策略。

package sample;

import java.math.*;
import java.util.*;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;

public class PoliticalCandidate {

    private String lastName;
    private String firstName;
    private Date dateOfBirth;
    private BigDecimal moneyRaised;
    private State homeState;
    
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }
    
    public PoliticalCandidate(String lastName, String firstName,
            Date dob, BigDecimal money, State s) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.dateOfBirth = dob;
        this.moneyRaised = money;
        this.homeState = s;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }
    public Date getDateOfBirth() {
        return dateOfBirth;
    }
    public void setMoneyRaised(BigDecimal moneyRaised) {
        this.moneyRaised = moneyRaised;
    }
    public BigDecimal getMoneyRaised() {
        return moneyRaised;
    }
    public void setHomeState(State homeState) {
        this.homeState = homeState;
    }
    public State getHomeState() {
        return homeState;
    }
}

package sample;

import org.apache.commons.lang.builder.ReflectionToStringBuilder;

public class State {
    
    private String shortName;
    private String name;
    
    public State(String shortName, String name) {
        this.shortName = shortName;
        this.name = name;
    }
    
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }
    public void setShortName(String shortName) {
        this.shortName = shortName;
    }
    public String getShortName() {
        return shortName;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
package sample;

import java.math.*;
import java.util.*;

import junit.framework.TestCase;

public class TestToStirng extends TestCase {

    public void testToString() {
        State va = new State("VA", "Virginia");
        
        Calendar calendar = new GregorianCalendar();
        calendar.set(Calendar.YEAR, 1743);
        calendar.set(Calendar.MONTH, Calendar.APRIL);
        calendar.set(Calendar.DAY_OF_MONTH, 13);
        Date dob = calendar.getTime();
        
        BigDecimal moneyRaised = new BigDecimal(293829292.93);
        
        PoliticalCandidate candidate = 
            new PoliticalCandidate("Jefferson", "Thomas", 
                    dob, moneyRaised, va);
        
        System.out.println(candidate);
    }

}
 輸出如下:

com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca

    [lastName=Jefferson,\firstName=Thomas,

     dateOfBirth=Sat Apr 13 22:38:42 CST 1743,

     moneyRaised=\293829292.930000007152557373046875,

     state=\com.discursive.jccook.lang.builders.State@87816d

         [abbreviation=VA,name=Virginia]]

看完了ReflectionToStringBuilder後,發現一個問題是輸出的內容過多,如果想對toString()方法輸出的內容進行定製,

則需要使用ToStringBuilder和ToStringStyle這兩個類。

ToStringBuilder類中的append方法可以向該類添加基本類型、數組和對象 ,只有添加的方法纔會被toString方法輸出。

ToStringStyle類則是對輸出的內容進行格式化。

public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
                .append("name", name)
                .append("age", age)
                .toString();
    }
 最近抽時間看完了ArrayUtils類,這個類的功能是實現數組的一些操作。

包括輸出數據的值,克隆數組,翻轉數組,對象數組和基本數組的轉換,搜索特定項等等。

最基本的是toString()方法。該方法用來輸出數組的內容,它有兩個重載版本,分別是:

static String toString(Object array)

static String toString(Object array, String stringIfNull)

第一個方法:帶有一個參數的方法在遇到數組爲空時將打印"{}",

第二個方法:帶有兩個參數的方法在遇到數組爲空時,便會打印stringIfNull的值。請看例子:

import org.apache.commons.lang.ArrayUtils;

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] intArray = { 1, 2, 3 };
        System.out.println("intArray contains: "
                + ArrayUtils.toString(intArray));
        
        double[] doubleArray = null;
        System.out.println("toString(Object[] array): "
                + ArrayUtils.toString(doubleArray));
        System.out.println("toString(Object[] array, String stringIfNull): "
                + ArrayUtils.toString(doubleArray, "doubleArray is null"));
    }
}
 ArrayUtils類實現的第二個功能是克隆數組,查看文檔可以看到ArrayUtils類已經將基本數據類型和Object類型的clone()函數重載了。

所以它可以實現數組的克隆。請看以下代碼片斷:

int[] array = { 1, 2, 3 };

int[] cloneArray = ArrayUtils.clone(array);

只需要簡單地以行代碼就可以完成克隆操作了。

 

ArrayUtils類實現的另一個功能是翻轉數組,即將數組反向排列。

同clone()方法相同,reverse()方法也已經將所有基本類型和類類型都重載了。只需要以行代碼就能完成翻轉操作。見下面代碼:

int[] array = { 1, 2, 3 };

int[] reservered = ArrayUtils.reverse(array);

通過克隆和翻轉數組兩個方法,我們可以避免自己動手寫循環來實現這些功能。

 

ArrayUtils類還實現了對象數組和基本類型數組的互相轉換。使用的兩個方法是toObject()和toPrimitive()。

ArrayUtils類還提供了在數組中查詢查詢特定項的方法——indexOf()和lastIndexOf()。

只需要將數組和要查找的值作爲參數傳入方法就可以了,返回的是特定項在數組中的位置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章