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) >= 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 );
Java的反射机制的确能做很多事情,这种强大的功能因此被广泛应用在Struts2、Spring、Hibernate中,今天我们也来过一把瘾,玩一把Java的反射。当然本文的例子比较简单,仅提供了一个日志记录的思路和实现,不过这个简单的实现已经基本能够完成目前所需要的功能,有兴趣的童鞋和小盆友扩展一下吧,扩展好了,给我说一声啊。
-东营 sparta-紫杉 原创,转载请注明出处 :)
http://www.blogjava.net/SpartaYew/
SpartaYew@163.com
QQ:22086526