Sparta Yew

               簡約、職業(yè)、恒久
          隨筆 - 15, 文章 - 1, 評論 - 276, 引用 - 0

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          公告


          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          Java反射機(jī)制與Log4j實(shí)現(xiàn)數(shù)據(jù)歷史記錄


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


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

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

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

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

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

              代碼如下:

          /**
           * 利用java反射技術(shù)實(shí)現(xiàn)記錄各對象相關(guān)的參數(shù)改變
           * 
          @author sparta 10/07/22 9:25
           * 
          @param  obj    運(yùn)行時(shí)java對象
           * 
          @param  logger 日志組件對象
           * 
          @return void
           
          */

          public static void log4Data(Object obj, Logger logger) 
            
          throws SecurityException,NoSuchMethodException, IllegalArgumentException, 
             IllegalAccessException, InvocationTargetException
          {

           
          //得到運(yùn)行時(shí)對象
           Class obj1 = obj.getClass();

           
          //得到運(yùn)行時(shí)對象的所有方法
           Method[] methods = obj1.getMethods();
           String methodName 
          = "";

           
          //將以get開頭的方法得到的參數(shù)進(jìn)行記錄
           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+ "::::::::::");
           }

          }


          調(diào)用如下:

          //導(dǎo)入相關(guān)類 
          import org.apache.log4j.Logger;
          import *.*.User;
          import *.Util;

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

          //實(shí)例化并響應(yīng)User類構(gòu)建器(性名和年齡)
          User user = new User(“lxb”,32);

          //調(diào)用log4Data,該log4Data()方法屬于Util類
          Util.log4Data( user, logger );


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



                      -東營 sparta-紫杉 原創(chuàng),轉(zhuǎn)載請注明出處 :)
                      http://www.aygfsteel.com/SpartaYew/
                      SpartaYew@163.com
           
                      
          QQ:22086526

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

          評論

          # re: Java反射機(jī)制與Log4j實(shí)現(xiàn)數(shù)據(jù)歷史記錄[未登錄]  回復(fù)  更多評論   

          嗯,這個log確實(shí)有啟發(fā)性的意義。如何記錄一個bean的數(shù)據(jù)改變狀態(tài),這個比較麻煩,現(xiàn)在為止還沒找到一個簡單有效的辦法
          2013-09-15 23:34 | David
          主站蜘蛛池模板: 增城市| 石楼县| 太仓市| 崇仁县| 盐城市| 漳浦县| 肥东县| 鹤庆县| 广西| 云霄县| 罗山县| 广州市| 泗水县| 阳信县| 百色市| 田东县| 田阳县| 济宁市| 临城县| 呼图壁县| 渝北区| 辰溪县| 凌源市| 墨竹工卡县| 盖州市| 唐海县| 黑水县| 怀远县| 固原市| 陈巴尔虎旗| 海淀区| 临湘市| 南涧| 和静县| 孙吴县| 东山县| 六安市| 高安市| 云梦县| 莱西市| 项城市|