JAVA 自定义toString打印对象
在项目开发中,获取到一个对象后,经常需要查看对象的值,而对象并不像基本数据类型那样可以直接打印出值来,所以需要调用对象的get方法,或者debug,这样很麻烦,尽管apache的commons-lang.jar包里提供了打印对象的方法,但是实际上,根本用不着那样的复杂,为了让程序跑的更快跑的更远,既需要实现功能,又需要代码简洁、高效,所以写了一个自认为简洁、高效的打印对象的方法,利用了java独特的反射机制:直接看代码,欢迎砸砖头http://www.agoit.com/images/smiles/icon_smile.gif有一点需要申明的就是:本例不可以输出互相引用的对象,比如ClassA引用ClassB,ClassB也引用了ClassA,如果是这种情况调用如下方法打印,会出现无限递归,很快会栈溢出的,所以如果是这种情况,请使用apache提供的方法!
import java.lang.reflect.Field;public class BeanToStringUtils {public static String toString(Object obj){StringBuilder sb = null;try {Class<?> c = obj.getClass();Field[] fields = c.getDeclaredFields();sb = new StringBuilder();sb.append(obj.getClass().getName());sb.append(" {");int i = 1;for(Field fd : fields){fd.setAccessible(true);sb.append(fd.getName());sb.append(":");sb.append(fd.get(obj));if(i != fields.length){sb.append(", ");}i++;}sb.append("}");} catch (Exception e) {e.printStackTrace();} return sb.toString();}}
如果对象内部又引用了对象,也是可以打印出来的,只要对象不为null
测试类:
import javax.xml.bind.annotation.XmlRootElement;import xxx.BeanToStringUtils;public class User {private String name;private int age;private String sex;private Address adress;public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Address getAdress() {return adress;}public void setAdress(Address adress) {this.adress = adress;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return BeanToStringUtils.toString(this);}public static void main(String[] args) {User user = new User();user.setAge(18);user.setSex("belle");user.setName("西施");Address add = new Address();add.setCountry("中国");add.setCity("北京市");add.setArea("昌平区");add.setStreet("龙锦东三街");user.setAdress(add);System.out.println(user);}}class Address{private String country;private String city;private String area;private String street;public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getArea() {return area;}public void setArea(String area) {this.area = area;}public String getStreet() {return street;}public void setStreet(String street) {this.street = street;}@Overridepublic String toString() {return BeanToStringUtils.toString(this);}}
记得需要重写toString方法,输出结果如下:
xxx.User {name:西施, age:18, sex:belle, adress:xxx.Address {country:中国, city:北京市, area:昌平区, street:龙锦东三街}}
页:
[1]