Java反射機制與Log4j實現數據 – JAVA編程語言程序開發技術文章

 在原來的基礎上進行重新設計,采用縱向擴展字段的設計方式,能夠擺脫在日志記錄中的大量訪問數據庫造成的效率困擾,是一個可行的思路。

    但有沒有更加簡潔的方式,比如在日志記錄中直接擺脫數據庫,采用成熟的log4j來進行日志記錄,完成記錄數據動態改變的歷史?


    我們不妨先來分析一下吧,在本公司內的框架使用中,對數據的修改大部分是通過getXX()和setXX()方法來實現的,這給我們一種啟發,在數據修改的過程中,若是能夠得到正在運行著對象,並通過該對象的getXX方法就能夠得到對象被修改後的數據,然後進行保存。這個思路讓人興奮,同時具有挑戰性,在系統運行過程中,如何才能得到正在運行著的對象呢?


    答案就是Java的反射機制:JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。

    代碼如下:


/** *//**
 * 利用java反射技術實現記錄各對象相關的參數改變
 * @author sparta 10/07/22 9:25
 * @param  obj    運行時java對象
 * @param  logger 日志組件對象
 * @return void
 */
public static void log4Data(Object obj, Logger logger)
  throws SecurityException,NoSuchMethodException, IllegalArgumentException,
   IllegalAccessException, InvocationTargetException{


 //得到運行時對象
 Class obj1 = obj.getClass();


 //得到運行時對象的所有方法
 Method[] methods = obj1.getMethods();
 String methodName = “”;


 //將以get開頭的方法得到的參數進行記錄
 for(Method method : methods){
  
  methodName = ((Member) method).getName();


  //過濾掉不以get開頭的方法,並且過濾掉以get開頭的getClass方法。
  if(methodName.indexOf(“get”,0) < 0 ||methodName.indexOf(“getCla”,0) >= 0) continue;
  
  Method getMethod = obj1.getMethod(methodName, null);
  logger.info(“::::::::::”+ methodName + “=” + getMethod.invoke(obj, null) + “::::::::::”);
 }
}


調用如下:


//導入相關類
import org.apache.log4j.Logger;
import *.*.User;
import *.Util;


//實例化log4j對象
Logger logger = Logger.getLogger( this.getClass() );


//實例化並響應User類構建器(性名和年齡)
User user = new User(“lxb”,32);


//調用log4Data,該log4Data()方法屬於Util類
Util.log4Data( user, logger );

發佈留言