SpringAOP中,获取参数名称
2017-04-02 13:07
471 查看
由于项目中打印日志的需要,研究了一下在aop中,获取参数名称的方法。
1、jdk1,8中,比较简单,直接通过joinPoint中的getSignature()方法即可获取
Signature signature = joinpoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
String[] strings = methodSignature.getParameterNames();
System.out.println(Arrays.toString(strings));
![](https://img-blog.csdn.net/20170402132535738?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVGhpbmtpbmdUX1Q=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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();
}
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; }
相关文章推荐
- spring aop 利用JoinPoint获取参数的值和方法名称
- Spring AOP获取拦截方法的参数名称跟参数值
- Spring AOP获取拦截方法的参数名称跟参数值
- spring aop 利用JoinPoint获取参数的值和方法名称
- Spring中的AOP(五)——在Advice方法中获取目标方法的参数
- Spring中的AOP 在Advice方法中获取目标方法的参数(顶)
- Spring之运行时获取controller参数名称的方法
- Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
- spring Aop 配置文件方式+JoinPoint获取参数
- 通过SpringAOP获取request中所有参数,记录用户操作日志
- Spring 中 java 获取方法参数名称
- Spring boot 通过AOP获取参数名称及参数值并对参数进行校验
- Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
- Spring aop: 如何在增强方法中获取并修改目标函数的参数
- Spring中的AOP——在Advice方法中获取目标方法的参数
- spring aop 获得参数名称和值得map
- spring AOP 之 获取 被切函数参数 被切函数返回值 以及 修改被切函数返回值
- spring aop 之获取 被切函数 参数及返回值
- 记一些spring的aop中一些常用获取参数的方法
- Spring AOP——在通知(Advice)方法中获取目标方法的参数