一、獲取註解參數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(); }