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()。
只需要將數組和要查找的值作爲參數傳入方法就可以了,返回的是特定項在數組中的位置。