1. 程式人生 > >java實體類重寫toString()方法

java實體類重寫toString()方法

實體類一般需要重寫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();
    }
 
}