一、获取注解参数java
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); //获取注解参数值 ValidateUrl validateObj = methodSignature.getMethod().getAnnotation(ValidateUrl.class); String serviceName = validateObj.serviceName(); String sourceSystem = generateKeyBySpEL(validateObj.sourceSystem(), joinPoint);
二、解析参数值spring
/** * 解析SpEL表达式 * @param spELString * @param joinPoint * @return */ private String generateKeyBySpEL(String spELString, JoinPoint joinPoint) { if(StringUtils.isBlank(spELString)){ return null; } // 经过joinPoint获取被注解方法 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); // 使用spring的DefaultParameterNameDiscoverer获取方法形参名数组 String[] paramNames = nameDiscoverer.getParameterNames(method); // 解析事后的Spring表达式对象 Expression expression = parser.parseExpression(spELString); // spring的表达式上下文对象 EvaluationContext context = new StandardEvaluationContext(); // 经过joinPoint获取被注解方法的形参 Object[] args = joinPoint.getArgs(); // 给上下文赋值 for(int i = 0 ; i < args.length ; i++) { context.setVariable(paramNames[i], args[i]); } // 表达式从上下文中计算出实际参数值 /*如:@annotation(key="#student.name") 那么就能够解析出方法形参的某属性值“Tom” */ return expression.getValue(context).toString(); }