SpElUtil.java 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package cn.iocoder.dashboard.util.sping;
  2. import org.aspectj.lang.ProceedingJoinPoint;
  3. import org.aspectj.lang.reflect.MethodSignature;
  4. import org.springframework.core.DefaultParameterNameDiscoverer;
  5. import org.springframework.expression.EvaluationContext;
  6. import org.springframework.expression.Expression;
  7. import org.springframework.expression.spel.standard.SpelExpressionParser;
  8. import org.springframework.expression.spel.support.StandardEvaluationContext;
  9. import java.lang.reflect.Method;
  10. public class SpElUtil {
  11. private SpElUtil() {
  12. }
  13. public static String analysisSpEl(String spElString, ProceedingJoinPoint joinPoint) {
  14. SpelExpressionParser parser = new SpelExpressionParser();
  15. DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
  16. // 通过joinPoint获取被注解方法
  17. MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
  18. Method method = methodSignature.getMethod();
  19. // 使用spring的DefaultParameterNameDiscoverer获取方法形参名数组
  20. String[] paramNames = nameDiscoverer.getParameterNames(method);
  21. // 解析过后的Spring表达式对象
  22. Expression expression = parser.parseExpression(spElString);
  23. // spring的表达式上下文对象
  24. EvaluationContext context = new StandardEvaluationContext();
  25. // 通过joinPoint获取被注解方法的形参
  26. Object[] args = joinPoint.getArgs();
  27. // 给上下文赋值
  28. for (int i = 0; i < args.length; i++) {
  29. context.setVariable(paramNames[i], args[i]);
  30. }
  31. Object value = expression.getValue(context);
  32. return value == null ? "null" : value.toString();
  33. }
  34. }