一、注解的参数获取:
@Around("myPointCut() && @annotation(a)")
public Object mylogger(ProceedingJoinPoint pjp,AndawellTransactional a) throws Throwable {
//注意@annotation(a)里的a要与AndawellTransactional a的a一致,叫什么无所谓。
String dbTable = a.dbTable();//获取参数dbTable
String dbId = a.dbId();//获取参数dbId
}
二、连接点方法参数的获取:
最常用:
1.获取参数:
Object[] paramValues = joinPoint.getArgs();
2.获取参数名:
String[] aaa = ((CodeSignature)pjp.getSignature()).getParameterNames();
在这里插入代码片
其他:
0.获取注解
RequestMapping annotation = pjp.getTarget().getClass().getAnnotation(RequestMapping.class);
annotation.value(); //类
RequestMapping annotation1 = ((MethodSignature) pjp.getSignature()).getMethod().getAnnotation(RequestMapping.class);
annotation1.value(); //方法
1.获取的实体类
Object target = point.getTarget(); //实体类
String className = point.getTarget().getClass().getName(); //实体类名
2.获取的方法名称
String methodName = point.getSignature().getName();
3.获取的类方法的参数(注解参数直接a.)
Object[] args = point.getArgs();
//处理参数
Object[] args = pjp.getArgs();
Map myMap = JSON.parseObject(JSON.toJSONString(args[0]),Map.class);
if (!myMap.containsKey(editId)) {
return R.fail("参数格式有误");
} else {
editIdValue = myMap.get(editId).toString();
versionBefore =
transactionalMapper.selectVersion(dbTable, dbId, editIdValue);
}
4.获取的参数类型
Class[] parameterTypes = ((MethodSignature)point.getSignature()).getMethod().getParameterTypes();
5.通过反射获得拦截的method
Method m = target.getClass().getMethod(methodName, parameterTypes);
6.通过反射执行目标对象的连接点的方法
Object o = point.proceed();
7.通过反射执行目标对象连接点处的方法,使用新的参数列表替换原来的:
point.proceed(Object[] args);