天天看點

spring aop 獲得參數名稱和值得map

<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&lt;String, Object&gt; inputParam = </code><code>new</code> <code>HashMap&lt;String, Object&gt;();</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&lt;String,Object&gt; 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&lt;String,Object&gt; 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&lt;?&gt; 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&lt;String,Object &gt; map=</code><code>new</code> <code>HashMap&lt;String,Object&gt;();  </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 &lt; 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,如需轉載請自行聯系原作者