<code>import</code> <code>java.lang.reflect.Modifier;</code>
<code>import</code> <code>java.util.HashMap;</code>
<code>import</code> <code>java.util.Map;</code>
<code>import</code> <code>javassist.ClassClassPath;</code>
<code>import</code> <code>javassist.ClassPool;</code>
<code>import</code> <code>javassist.CtClass;</code>
<code>import</code> <code>javassist.CtMethod;</code>
<code>import</code> <code>javassist.bytecode.CodeAttribute;</code>
<code>import</code> <code>javassist.bytecode.LocalVariableAttribute;</code>
<code>import</code> <code>javassist.bytecode.MethodInfo;</code>
<code>import</code> <code>javax.servlet.http.HttpServletRequest;</code>
<code>import</code> <code>org.aspectj.lang.JoinPoint;</code>
<code>import</code> <code>org.aspectj.lang.annotation.Aspect;</code>
<code>import</code> <code>org.aspectj.lang.annotation.Before;</code>
<code>import</code> <code>org.aspectj.lang.annotation.Pointcut;</code>
<code>import</code> <code>org.springframework.stereotype.Component;</code>
<code>import</code> <code>org.springframework.web.context.request.RequestContextHolder;</code>
<code>import</code> <code>org.springframework.web.context.request.ServletRequestAttributes;</code>
<code>import</code> <code>com.glodon.bim5d.controller.BaseController;</code>
<code>import</code> <code>com.glodon.bim5d.util.LoggerMsgUtil;</code>
<code>@Aspect</code>
<code>@Component</code>
<code>public</code> <code>class</code> <code>LogAspect {</code>
<code> </code>
<code> </code><code>@Pointcut</code><code>(</code><code>"execution(public void xxx.xxx.xxx.controller.QRCodeController.download(..))"</code><code>) </code>
<code> </code><code>public</code> <code>void</code> <code>pointCut() { </code>
<code> </code><code>} </code>
<code> </code>
<code> </code><code>@Before</code><code>(</code><code>"pointCut()"</code><code>) </code>
<code> </code><code>public</code> <code>void</code> <code>before(JoinPoint joinPoint) </code><code>throws</code> <code>Exception {</code>
<code> </code><code>//獲得代理類 </code>
<code> </code><code>BaseController controller = (BaseController)joinPoint.getTarget();</code>
<code> </code><code>//獲得request</code>
<code> </code><code>HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();</code>
<code> </code><code>String uri = request.getRequestURI();</code>
<code> </code><code>String queryString = request.getQueryString();</code>
<code> </code><code>String projectId = getProjectId(joinPoint);</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>HashMap<String, Object> inputParam = </code><code>new</code> <code>HashMap<String, Object>();</code>
<code> </code><code>inputParam.put(</code><code>"uri"</code><code>, uri);</code>
<code> </code><code>inputParam.put(</code><code>"projectId"</code><code>, projectId);</code>
<code> </code><code>inputParam.put(</code><code>"RequestBody"</code><code>, queryString);</code>
<code> </code><code>LoggerMsgUtil.enterMethodInfo(controller.getLogger(), inputParam);</code>
<code> </code><code>} </code><code>catch</code> <code>(Exception e) {</code>
<code> </code><code>LoggerMsgUtil.Info(controller.getLogger(), </code><code>"記錄入口參數失敗:{0}"</code><code>, e.getMessage());</code>
<code> </code><code>} </code>
<code> </code><code>/**</code>
<code> </code><code>* 從參數清單中擷取projectId</code>
<code> </code><code>* </code>
<code> </code><code>*/</code>
<code> </code><code>private</code> <code>String getProjectId(JoinPoint joinPoint){</code>
<code> </code><code>String projectId = </code><code>null</code><code>;</code>
<code> </code><code>//擷取參數名稱和值 </code>
<code> </code><code>Map<String,Object> nameAndArgs = getFieldsNameValueMap(joinPoint); </code>
<code> </code><code>projectId = nameAndArgs.get(</code><code>"projectId"</code><code>) == </code><code>null</code> <code>? </code><code>null</code> <code>: String.valueOf(nameAndArgs.get(</code><code>"projectId"</code><code>));</code>
<code> </code><code>}</code>
<code> </code><code>return</code> <code>projectId;</code>
<code> </code><code>}</code>
<code> </code><code>private</code> <code>Map<String,Object> getFieldsNameValueMap(JoinPoint joinPoint) </code><code>throws</code> <code>Exception { </code>
<code> </code><code>Object[] args = joinPoint.getArgs();</code>
<code> </code><code>String classType = joinPoint.getTarget().getClass().getName(); </code>
<code> </code><code>Class<?> clazz = Class.forName(classType); </code>
<code> </code><code>String clazzName = clazz.getName(); </code>
<code> </code><code>String methodName = joinPoint.getSignature().getName(); </code><code>//擷取方法名稱 </code>
<code> </code><code>Map<String,Object > map=</code><code>new</code> <code>HashMap<String,Object>(); </code>
<code> </code><code>ClassPool pool = ClassPool.getDefault(); </code>
<code> </code><code>ClassClassPath classPath = </code><code>new</code> <code>ClassClassPath(</code><code>this</code><code>.getClass()); </code>
<code> </code><code>pool.insertClassPath(classPath); </code>
<code> </code><code>CtClass cc = pool.get(clazzName); </code>
<code> </code><code>CtMethod cm = cc.getDeclaredMethod(methodName); </code>
<code> </code><code>MethodInfo methodInfo = cm.getMethodInfo(); </code>
<code> </code><code>CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); </code>
<code> </code><code>LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); </code>
<code> </code><code>if</code> <code>(attr == </code><code>null</code><code>) { </code>
<code> </code><code>throw</code> <code>new</code> <code>RuntimeException();</code>
<code> </code><code>} </code>
<code> </code><code>int</code> <code>pos = Modifier.isStatic(cm.getModifiers()) ? </code><code>0</code> <code>: </code><code>1</code><code>; </code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = </code><code>0</code><code>; i < cm.getParameterTypes().length; i++){ </code>
<code> </code><code>map.put( attr.variableName(i + pos),args[i]);</code><code>//paramNames即參數名 </code>
<code> </code><code>return</code> <code>map; </code>
<code> </code><code>} </code>
<code>}</code>
本文轉自 斯然在天邊 51CTO部落格,原文連結:http://blog.51cto.com/13172906/1964811,如需轉載請自行聯系原作者