SpringAOP中,获取参数名称

来源:互联网 发布:梦幻西游频繁网络错误 编辑:程序博客网 时间:2024/05/30 23:46

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

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

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



2.通用方法。比较麻烦

public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable{String classType = joinPoint.getTarget().getClass().getName();          Class<?> clazz = Class.forName(classType);          String clazzName = clazz.getName();          String methodName = joinPoint.getSignature().getName(); //获取方法名称         Object[] args = joinPoint.getArgs();//参数          //获取参数名称和值        Map<String,Object > nameAndArgs = getFieldsName(this.getClass(), clazzName, methodName,args);         System.out.println(nameAndArgs.toString());        //为了省事,其他代码就不写了,        return result = joinPoint.proceed(); }

private Map<String,Object> getFieldsName(Class cls, String clazzName, String methodName, Object[] args) throws NotFoundException { Map<String,Object > map=new HashMap<String,Object>();        ClassPool pool = ClassPool.getDefault();          //ClassClassPath classPath = new ClassClassPath(this.getClass());          ClassClassPath classPath = new ClassClassPath(cls);          pool.insertClassPath(classPath);                    CtClass cc = pool.get(clazzName);          CtMethod cm = cc.getDeclaredMethod(methodName);          MethodInfo methodInfo = cm.getMethodInfo();        CodeAttribute codeAttribute = methodInfo.getCodeAttribute();          LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);          if (attr == null) {              // exception          }         // String[] paramNames = new String[cm.getParameterTypes().length];          int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1;          for (int i = 0; i < cm.getParameterTypes().length; i++){              map.put( attr.variableName(i + pos),args[i]);//paramNames即参数名          }                  //Map<>        return map;      }  



0 1
原创粉丝点击