运用AOP来记录用户的操作日志在项目中比较常见,优点是只需在一个地方编写Advice,通过AOP声明(织入)然后就可以记录很多不同的操作(API)。但是也有其缺点,因为Advice服务于不同的API,而各个API的参数,返回值不同,甚至服务的对象都不一样,那么能做到的也只能是判断是否有异常,异常的具体信息等简单的内容。如果想要个性化的为每一个API都记录执行参数,返回值,甚至Target的属性时就无能为力,因为能够拿到对象,但是不知道到底是什么类型的。本文就利用Java反射机制来获取这些信息。
首先要能使用反射,那么就必须知道方法或者属性名称,所以需要配置相关信息。本示例中用Bean的属性(Field)来配置。一个操作对应一个API,由开发人员配置。最后记录的信息以key=value的形式保存,key就是key,容易理解,value是指对对象(参数和返回值两种)的field属性值,如果嵌套多层则用.(dot)隔开。值得注意的的参数的情形,[0]表示第一个参数,[1]表示第二个参数。之所以使用序号是由于Java参数名在编译完之后会丢失,如果AOP使用AspectJ编译的话可以保存。XML文件具体设置如下:
<apis>
<api name="ServerWebServiceImp.login">
<params>
<param key="user_name" value="[0]" />
<param key="password" value="[1]" />
</params>
<returns>
<return key="aspclient_id" value="ASPClient_Id" />
<return key="user_id" value="users_Id" />
</returns>
</api>
</apis>
需要把XML解析为JavaBean存到内存里面,解析引擎有很多选择,如Dom4j等。具体的解析过程不贴了,很简单,JavaBean如下:
/**
* API实