<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

      Sparta Yew

         簡約、職業、恒久
    隨筆 - 15, 文章 - 1, 評論 - 276, 引用 - 0
    數據加載中……

    Java反射機制與Log4j實現數據歷史記錄


        sparta-紫杉  2010-7-22 9: 42


        記得09年的時候,當時由于項目需要,需要記錄數據的修改歷史及修改者,主要是為數據的動態改變提供參考。那么在當時的情景下,采用log4j是不能完成這一需求的。因此專門為公司開發了日志模塊,類似于log4j,并起名為log4Drgs。該log4Drgs日志模塊采用Oracle9i記錄數據的歷史的改變和操作者,可最多滿足頁面999條數據字段的修改記錄,并且可以根據字段的多少進行擴展(當然是在999條的范圍內,一個頁面一般不會超過999個字段內容),并打包成通用jar文件供全公司使用。這在當時為數據記錄的確發揮了很重要的作用,但是隨著應用的逐步復雜性,頁面上的字段內容越來越多,特別是在采用循環方式保存數型結構的大量數據時,該log4Drgs模塊逐漸暴露出其效率低下的致命傷;特別是這種橫向擴展字段的設計方式已經不能滿足字段超過999條的需要。

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

        但有沒有更加簡潔的方式,比如在日志記錄中直接擺脫數據庫,采用成熟的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>= 0continue;
       
      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 );


        Java的反射機制的確能做很多事情,這種強大的功能因此被廣泛應用在Struts2、Spring、Hibernate中,今天我們也來過一把癮,玩一把Java的反射。當然本文的例子比較簡單,僅提供了一個日志記錄的思路和實現,不過這個簡單的實現已經基本能夠完成目前所需要的功能,有興趣的童鞋和小盆友擴展一下吧,擴展好了,給我說一聲啊。



                -東營 sparta-紫杉 原創,轉載請注明出處 :)
                http://www.tkk7.com/SpartaYew/
                SpartaYew@163.com
     
                
    QQ:22086526

    posted on 2011-05-19 16:12 sparta-紫杉 閱讀(2803) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: Java反射機制與Log4j實現數據歷史記錄[未登錄]  回復  更多評論   

    嗯,這個log確實有啟發性的意義。如何記錄一個bean的數據改變狀態,這個比較麻煩,現在為止還沒找到一個簡單有效的辦法
    2013-09-15 23:34 | David
    主站蜘蛛池模板: 国精无码欧精品亚洲一区| a级亚洲片精品久久久久久久| 久久亚洲国产精品| 久久久久久毛片免费看| 无码欧精品亚洲日韩一区夜夜嗨| 亚洲成在人线在线播放无码| 成人在线视频免费| 亚洲色www永久网站| 女人张开腿等男人桶免费视频| 香蕉大伊亚洲人在线观看| 免费理论片51人人看电影| 亚洲AV香蕉一区区二区三区| 国产成人免费永久播放视频平台| 免费观看亚洲人成网站| 亚洲国产婷婷综合在线精品| 亚洲无线观看国产精品| 亚洲高清视频一视频二视频三| 亚洲第一页在线视频| 91精品免费国产高清在线| 激情综合亚洲色婷婷五月APP | 亚洲人成电影青青在线播放| 日韩免费一区二区三区在线| 久久久久亚洲AV无码去区首| 免费一级毛片在线播放不收费| h视频免费高清在线观看| 亚洲国产第一页www| 无人影院手机版在线观看免费| 久久久久亚洲AV无码去区首| 亚洲日韩中文无码久久| 久久国产色AV免费看| 亚洲人成网站999久久久综合| 亚洲午夜AV无码专区在线播放| 无码日韩精品一区二区三区免费| 亚洲91精品麻豆国产系列在线| 免费中文字幕在线| 久热免费在线视频| 亚洲精品日韩一区二区小说| 亚洲精品V欧洲精品V日韩精品| 免费可以在线看A∨网站| 九九免费久久这里有精品23| 亚洲高清日韩精品第一区|