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()。
只需要将数组和要查找的值作为参数传入方法就可以了,返回的是特定项在数组中的位置。