AOP获取参数名称

由于项目中打印日志的需要,研究了一下在aop中,获取参数名称的方法。

1、jdk1,8中,比较简单,直接通过joinPoint中的getSignature()方法即可获取

[java]  view plain  copy
  1. Signature signature = joinpoint.getSignature();  
  2. MethodSignature methodSignature = (MethodSignature) signature;  
  3. String[] strings = methodSignature.getParameterNames();  
  4. System.out.println(Arrays.toString(strings));  



2.通用方法。比较麻烦

[java]  view plain  copy
  1. public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{  
  2.           
  3.         String classType = joinPoint.getTarget().getClass().getName();    
  4.         Class<?> clazz = Class.forName(classType);    
  5.         String clazzName = clazz.getName();    
  6.         String methodName = joinPoint.getSignature().getName(); //获取方法名称   
  7.         Object[] args = joinPoint.getArgs();//参数  
  8.           //获取参数名称和值  
  9.         Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args);   
  10.         System.out.println(nameAndArgs.toString());  
  11.         //为了省事,其他代码就不写了,  
  12.         return result = joinPoint.proceed();  
  13.    
  14. }  

[java]  view plain  copy
  1. private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException {   
  2.         Map<String,Object > map=new HashMap<String,Object>();  
  3.           
  4.         ClassPool pool = ClassPool.getDefault();    
  5.         //ClassClassPath classPath = new ClassClassPath(this.getClass());    
  6.         ClassClassPath classPath = new ClassClassPath(cls);    
  7.         pool.insertClassPath(classPath);    
  8.             
  9.         CtClass cc = pool.get(clazzName);    
  10.         CtMethod cm = cc.getDeclaredMethod(methodName);    
  11.         MethodInfo methodInfo = cm.getMethodInfo();  
  12.         CodeAttribute codeAttribute = methodInfo.getCodeAttribute();    
  13.         LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);    
  14.         if (attr == null) {    
  15.             // exception    
  16.         }    
  17.        // String[] paramNames = new String[cm.getParameterTypes().length];    
  18.         int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;    
  19.         for (int i = 0; i < cm.getParameterTypes().length; i++){    
  20.             map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名    
  21.         }    
  22.           
  23.         //Map<>  
  24.         return map;    
  25.     } 

猜你喜欢

转载自blog.csdn.net/y534560449/article/details/80135290
今日推荐