出處:https://developer.aliyun.com/article/239346
說起反射,不得不說它實在是太強大了,通過反射就可以輕輕松松拿到各種東東,如果你想在項目中解除對某個類的依賴,可以考慮用反射。
今天跟大家分享的是通過java中的反射,獲取pojo類的所有字段值。
為什么要做這個操作的呢?主要是為了重寫實體類的toString方法。有人會說,直接重寫toString方法,返回字段.toString()的字符串不就行了。這么做的確可以,但是如果你的pojo類有上百個,上千個,你還要一個一個改嗎?所以我們需要從新的方向去解決。
因為我們所有的pojo類,都繼承一個IdEntity的pojo類。它只有一個id屬性,所以如果我在IdEntity中重寫了toString方法,那么其他所有繼承與IdEntity的pojo類都不用再寫了,而且也保證了格式的統一。這里要反射出pojo類的所有字段值,如果字段是其他pojo類的對象時,也要拿過來把所有屬性都列出來。
package entity.qx; import java.lang.reflect.Field; /** * @author : 崔成龍 * @group : tgb8 * @Date : 2014-4-9 下午8:37:22 * @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( )); }
效果圖如下:
這樣格式統一了,同時避免了由於代碼改動太多而導致出錯率上升,最重要的是可以節省大量的時間。以最小的代價完成修改功能,這是很有必要的。