1. 程式人生 > >AOP獲取引數名稱

AOP獲取引數名稱

由於專案中列印日誌的需要,研究了一下在aop中,獲取引數名稱的方法。

1、jdk1,8中,比較簡單,直接通過joinPoint中的getSignature()方法即可獲取

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


2.通用方法。比較麻煩

  1. public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{  
  2.         String classType = joinPoint.getTarget().getClass().getName();    
  3.         Class<?> clazz = Class.forName(classType);    
  4.         String clazzName = clazz.getName();    
  5.         String methodName = joinPoint.getSignature().getName(); //獲取方法名稱 
  6.         Object[] args = joinPoint.getArgs();//引數
  7.           //獲取引數名稱和值
  8.         Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args);   
  9.         System.out.println(nameAndArgs.toString());  
  10.         //為了省事,其他程式碼就不寫了,
  11.         return result = joinPoint.proceed();  
  12. }  

  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.         ClassPool pool = ClassPool.getDefault();    
  4.         //ClassClassPath classPath = new ClassClassPath(this.getClass());  
  5.         ClassClassPath classPath = new ClassClassPath(cls);    
  6.         pool.insertClassPath(classPath);    
  7.         CtClass cc = pool.get(clazzName);    
  8.         CtMethod cm = cc.getDeclaredMethod(methodName);    
  9.         MethodInfo methodInfo = cm.getMethodInfo();  
  10.         CodeAttribute codeAttribute = methodInfo.getCodeAttribute();    
  11.         LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);    
  12.         if (attr == null) {    
  13.             // exception  
  14.         }    
  15.        // String[] paramNames = new String[cm.getParameterTypes().length];  
  16.         int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;    
  17.         for (int i = 0; i < cm.getParameterTypes().length; i++){    
  18.             map.put( attr.variableName(i + pos),args[i]);//paramNames即引數名  
  19.         }    
  20.         //Map<>
  21.         return map;    
  22.     }