1. 程式人生 > >java中使用反射獲取pojo(實體)類的所有欄位值

java中使用反射獲取pojo(實體)類的所有欄位值

 說起反射,不得不說它實在是太強大了,通過反射就可以輕輕鬆鬆拿到各種東東,如果你想在專案中解除對某個類的依賴,可以考慮用反射。


       今天跟大家分享的是通過java中的反射,獲取pojo類的所有欄位值。


       為什麼要做這個操作的呢?主要是為了重寫實體類的toString方法。有人會說,直接重寫toString方法,返回欄位.toString()的字串不就行了。這麼做的確可以,但是如果你的pojo類有上百個,上千個,你還要一個一個改嗎?所以我們需要從新的方向去解決。


       因為我們所有的pojo類,都繼承一個IdEntity的pojo類。它只有一個id屬性,所以如果我在IdEntity中重寫了toString方法,那麼其他所有繼承與IdEntity的pojo類都不用再寫了,而且也保證了格式的統一。這裡要反射出pojo類的所有欄位值,如果欄位是其他pojo類的物件時,也要拿過來把所有屬性都列出來。

    package entity.qx;
     
    import java.lang.reflect.Field;
     
    /**
     * @Comments : 用於重寫實體類的toString方法
     * @Version : 1.0.0
     */
    public class EntityToString
    {
     
        /**
         * @MethodName : getString
         * @Description : 獲取類中所有屬性及屬性值
         * @param o
         *            操作物件
         * @param c
         *            操作類,用於獲取類中的方法
         * @return
         */
        public static String getString(Object o, Class< ? > c )
        {
            String result = c.getSimpleName( ) + ":";
     
            // 獲取父類,判斷是否為實體類
            if ( c.getSuperclass( ).getName( ).indexOf( "entity" ) >= 0 )
            {
                result +="\n<" +getString( o , c.getSuperclass( ) )+">,\n";
            }
     
            // 獲取類中的所有定義欄位
            Field[ ] fields = c.getDeclaredFields( );
     
            // 迴圈遍歷欄位,獲取欄位對應的屬性值
            for ( Field field : fields )
            {
                // 如果不為空,設定可見性,然後返回
                field.setAccessible( true );
     
                try
                {
                    // 設定欄位可見,即可用get方法獲取屬性值。
                    result += field.getName( ) + "=" + field.get( o ) +",\n";
                }
                catch ( Exception e )
                {
                    // System.out.println("error--------"+methodName+".Reason is:"+e.getMessage());
                }
            }
            if(result.indexOf( "," )>=0) result = result.substring( 0 , result.length( )-2 );
            return result;
        }
    }

       然後在IdEntity中,重寫toString方法即可:

@Override
public String toString(){
       return EntityToString.getString(this,this.getClass( ));
}        


       效果圖如下:

 

       這樣格式統一了,同時避免了由於程式碼改動太多而導致出錯率上升,最重要的是可以節省大量的時間。以最小的代價完成修改功能,這是很有必要的。