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.blogjava.net/SpartaYew/
            SpartaYew@163.com
 
            
QQ:22086526

posted on 2011-05-19 16:12 sparta-紫杉 阅读(2246) 评论(1)  编辑  收藏 所属分类: Java

评论

# re: Java反射机制与Log4j实现数据历史记录[未登录]  回复  更多评论   

嗯,这个log确实有启发性的意义。如何记录一个bean的数据改变状态,这个比较麻烦,现在为止还没找到一个简单有效的办法
2013-09-15 23:34 | David

只有注册用户登录后才能发表评论。


网站导航: