第一步:引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
第二步:创建切面类
/**
* @author yangyang
* @version 1.0
* @date 2022/4/29 14:17
* @description: 切面类示范
*/
@Aspect
@Slf4j
@Component
public class interFaceParamAspect {
@Pointcut("execution(public * com.xxx.xxx.Controller.addTask(..))")
public void addTask(){
}
@Around("addTask()")
public Object executeAddTask(ProceedingJoinPoint joinPoint){
try {
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);//获取被切参数名称及参数值
log.info("请求参数:{}", JSON.toJSONString(nameAndArgs));
Object result = joinPoint.proceed();
log.info("返回参数:{}", JSON.toJSONString(result));
return result;
}catch (ClassNotFoundException | NotFoundException e){
log.error("切面executeAddTask获取参数异常:",e);
}catch (Throwable e) {
log.error("切面executeAddTask放行异常:",e);
}
return CommonResult.fail(500, "系统异常");
}
/**
* 通过反射机制 获取被切参数名以及参数值
* @param cls
* @param clazzName
* @param methodName
* @param args
* @return
*/
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) {
return null;
}
// 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即参数名
}
return map;
}
}