但有没有更加简洁的方式,比如在日志记录中直接摆脱数据库,采用成熟的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 );