bean通过反射重写toString

Posted redqueen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bean通过反射重写toString相关的知识,希望对你有一定的参考价值。

思路1:

网上一大把,通过this.getClass().getDeclaredFields();获得所有属性,禁掉访问限制,最终输出属性值

// public String toString2() {
// System.out.println("enter sourceObj toString...");
//
// StringBuffer sb = new StringBuffer();
// Field[] fields = this.getClass().getDeclaredFields();
// for(Field iField : fields) {
// iField.setAccessible(true);
// sb.append(iField.getName());
// sb.append("=");
// try {
// sb.append(iField.get(this));
// }catch(IllegalArgumentException e) {
// e.printStackTrace();
// }catch(IllegalAccessException e) {
// e.printStackTrace();
// }
// sb.append(" ");
// }
// return sb.toString();
//
}

思路2:
bean自身有public的get set方法,找到对应方法,截取名字,通过Method.invoke方法得到当前属性值
public  String toString(){
System.out.println("SourceObj toString1...");

Class<?> clazz = this.getClass();
StringBuffer res = new StringBuffer(clazz.getSuperclass().getName() + " ");
for (; clazz != Object.class; clazz = clazz.getSuperclass()) {
// System.out.println(clazz.getName());
Method[] methods = clazz.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method tmp = methods[i];
String mName = tmp.getName();
if (mName.startsWith("get")) {
String fName = mName.substring(3);
res.append(fName + " = ");
try {
Object o = tmp.invoke(this, null);
if (o == null) {
res.append(" null ");
continue;
}
if (o instanceof Double) {
res.append("" + ((Double) o).doubleValue() + " ");
} else if (o instanceof Float) {
res.append("" + ((Float) o).floatValue() + " ");
} else if (o instanceof Long) {
res.append("" + ((Long) o).longValue() + " ");
} else if (o instanceof String) {
res.append("" + (String) o + " ");
} else if (o instanceof Date) {
res.append("" + ((Date) o).toString() + " ");
} else {
res.append("" + o.toString() + " ");
}
} catch (IllegalAccessException e) {
continue;
} catch (InvocationTargetException ex) {
continue;
}
}
}
}
return res.toString();
}

由于调用关系,需要注意getClass()获得的对象,this初始指向并不是bean本身。

技术图片

 

bean:


public class SourceObj extends BaseObj{

private String context;
private String memo;
private String source;

public String getContext() { return context; }
public void setContext(String context) { this.context = context; }
public String getMemo() { return memo; }
public void setMemo(String memo) { this.memo = memo; }
public String getSource() { return source; }
public void setSource(String source) { this.source = source; }

public String toString(){...}
}

 

以上是关于bean通过反射重写toString的主要内容,如果未能解决你的问题,请参考以下文章

Object类中的常用方法

java中使用反射获取pojo(实体)类的全部字段值

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

java 反射代码片段

为啥我可以通过反射在字段初始化后重写静态只读字段?