JAVA 自定义toString打印对象

在项目开发中,获取到一个对象后,经常需要查看对象的值,而对象并不像基本数据类型那样可以直接打印出值来,所以需要调用对象的get方法,或者debug,这样很麻烦,尽管apache的commons-lang.jar包里提供了打印对象的方法,但是实际上,根本用不着那样的复杂,为了让程序跑的更快跑的更远,既需要实现功能,又需要代码简洁、高效,所以写了一个自认为简洁、高效的打印对象的方法,利用了java独特的反射机制:直接看代码,欢迎砸砖头 :)
有一点需要申明的就是:本例不可以输出互相引用的对象,比如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;
}
@Override
public 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;
}

@Override
public String toString() {

return BeanToStringUtils.toString(this);
}
}



记得需要重写toString方法,输出结果如下:

xxx.User {name:西施, age:18, sex:belle, adress:xxx.Address {country:中国, city:北京市, area:昌平区, street:龙锦东三街}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值