java实体类重写toString()方法
2018-01-21 16:53
1226 查看
实体类一般需要重写toString()方法,在打印日志时输出参数的信息。但是如果手动拼接实体类里每个属性和属性值又比较麻烦,以下是常用的几种方法。
利用Apache工具类ToStringBuilder
如果输出信息想过滤掉某些特殊字段,如password,可以采用如下方式:
ToStringBuilder工具类还有以下几种显示方式:
/对象及其属性一行显示
ToStringBuilder.reflectionToString(this);
ToStringBuilder.reflectionToString(u, ToStringStyle.DEFAULT_STYLE)
//属性换行显示
ToStringBuilder.reflectionToString(u, ToStringStyle.MULTI_LINE_STYLE)
//不显示属性名,只显示属性值,在同一行显示
ToStringBuilder.reflectionToString(u, ToStringStyle.NO_FIELD_NAMES_STYLE)
//对象名称简写
ToStringBuilder.reflectionToString(u, ToStringStyle.SHORT_PREFIX_STYLE)
//不显示对象名称 只显示属性
ToStringBuilder.reflectionToString(u, ToStringStyle.SIMPLE_STYLE)
--------------------------------------------------------------------------------------------
另一种重写toString()的方法是利用反射机制,获取实体类的所有属性和方法,实现如下:
public class ToStringUtil{
/**
* 输出指定的某些字段fieldName, 如果不填则输出所有字段
* @param entity
* @param fieldName
* @return
*/
public static String toString(Entity entity, String... fieldName)
{
Class cls = entity.getClass();
StringBuffer buffer = new StringBuffer(cls.getSimpleName() + ": ");
try
{
//不获取私有方法
Method[] methods = cls.getMethods();
if(null != fieldName && fieldName.length != 0)
{
for(Method method: methods)
{
String mn = method.getName();
for(String fn: fieldName)
{
if(mn.equalsIgnoreCase("get" + fn))
{
String value = method.invoke(entity).toString();
buffer.append(mn + "=" + value + " &");
}
}
}
}
else
{
//得到所有field
Field[] fields = cls.getDeclaredFields();
for(Method method: methods)
{
String mn = method.getName();
for(Field field: fields)
{
String name = field.getName().toString();
if(mn.equalsIgnoreCase("get" + name))
{
String value = method.invoke(entity).toString();
buffer.append(name + "=" + value + " &");
}
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return buffer.substring(0, buffer.length()-1).toString();
}
}
利用Apache工具类ToStringBuilder
//方法1 输出对象名称简写 属性 属性值(我常用这种方式)
@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); }
如果输出信息想过滤掉某些特殊字段,如password,可以采用如下方式:
@Override public String toString() { return (new ReflectionToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) { @Override protected boolean accept(Field f) { return super.accept(f) && !f.getName().equalsIgnoreCase("password"); //过滤掉特殊字段 } }).toString(); }
ToStringBuilder工具类还有以下几种显示方式:
/对象及其属性一行显示
ToStringBuilder.reflectionToString(this);
ToStringBuilder.reflectionToString(u, ToStringStyle.DEFAULT_STYLE)
//属性换行显示
ToStringBuilder.reflectionToString(u, ToStringStyle.MULTI_LINE_STYLE)
//不显示属性名,只显示属性值,在同一行显示
ToStringBuilder.reflectionToString(u, ToStringStyle.NO_FIELD_NAMES_STYLE)
//对象名称简写
ToStringBuilder.reflectionToString(u, ToStringStyle.SHORT_PREFIX_STYLE)
//不显示对象名称 只显示属性
ToStringBuilder.reflectionToString(u, ToStringStyle.SIMPLE_STYLE)
--------------------------------------------------------------------------------------------
另一种重写toString()的方法是利用反射机制,获取实体类的所有属性和方法,实现如下:
public class ToStringUtil{
/**
* 输出指定的某些字段fieldName, 如果不填则输出所有字段
* @param entity
* @param fieldName
* @return
*/
public static String toString(Entity entity, String... fieldName)
{
Class cls = entity.getClass();
StringBuffer buffer = new StringBuffer(cls.getSimpleName() + ": ");
try
{
//不获取私有方法
Method[] methods = cls.getMethods();
if(null != fieldName && fieldName.length != 0)
{
for(Method method: methods)
{
String mn = method.getName();
for(String fn: fieldName)
{
if(mn.equalsIgnoreCase("get" + fn))
{
String value = method.invoke(entity).toString();
buffer.append(mn + "=" + value + " &");
}
}
}
}
else
{
//得到所有field
Field[] fields = cls.getDeclaredFields();
for(Method method: methods)
{
String mn = method.getName();
for(Field field: fields)
{
String name = field.getName().toString();
if(mn.equalsIgnoreCase("get" + name))
{
String value = method.invoke(entity).toString();
buffer.append(name + "=" + value + " &");
}
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
return buffer.substring(0, buffer.length()-1).toString();
}
}
相关文章推荐
- 重写Java实体类toString方法
- java实体类如果不重写toString方法,会如何?
- java实体类重写toString方法,得到想要字符串
- java实体类如果不重写toString方法,会如何?
- Java仿照JavaScript的JSON的stringify()方法重写toString()方法的启示
- Java 重写tostring方法
- java上机课代码。。。重写equals方法,toString方法。。。
- Java 深究字符串String类(2)之重写toString()方法无意识递归
- java学习之旅40--面向对象_13_继承_Object类用法_toString和equals方法_重写toString
- 重写java类的toString()方法, 安卓开发
- java 中重写toString()方法
- 一起学Java_Eclipse开发工具介绍及equals、toString方法的重写equals
- java反射覆写toString方法实现输出实体类属性值
- java equals() 和toString()方法重写
- Java重写ToString()方法的意义
- 22-JAVA面向对象-重写toString()与equals()方法
- Java类中重写toString方法
- 实体类自动重写toString(),equals()和hashCode()方法
- Java重写toString方法
- 【java】在java中为啥要重写toString 方法?