用到的相关类:
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
其中:
org.springframework.context.expression.MapAccessor 用于处理map数据
org.springframework.expression.Expression 表达式接口由org.springframework.expression.ExpressionParser创建
org.springframework.expression.ExpressionParser 表达式解析方案
org.springframework.expression.ParserContext 表达式格式指定接口
org.springframework.expression.common.TemplateParserContext 表达式格式实现类,即ParserContext的实现类
org.springframework.expression.spel.standard.SpelExpressionParser 用于生成表达式解析方案
org.springframework.expression.spel.support.StandardEvaluationContext 用于处理表达式数据
具体代码如下:
package com.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.ParserContext;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
public class ExpressServiceImpl {
private static final Logger log = LoggerFactory.getLogger(ExpressServiceImpl.class);
private ExpressionParser spelExpressionParser;
private ParserContext parserContext;
// 表达式解析上下文
private StandardEvaluationContext evaluationContext;
public static enum ExpressType {
/**
* ${}表达式格式
*/
TYPE_FIRST,
/**
* #{}表达式格式
*/
TYPE_SECOND
}
private static final String PRE_TYPE_1 = "${";
private static final String PRE_TYPE_2 = "#{";
private static final String SUF_STR = "}";
private ExpressServiceImpl(String pre, String suf) {
spelExpressionParser = new SpelExpressionParser();
log.debug("表达式前缀={},表达式后缀={}", pre, suf);
evaluationContext = new StandardEvaluationContext();
// 增加map解析方案
evaluationContext.addPropertyAccessor(new MapAccessor());
parserContext = new TemplateParserContext(pre, suf);
}
/**
*
* <p>
* 创建表达式处理服务对象 默认为创建#{}格式表达式 通过ExpressType指定表达式格式,现有两种${}和#{}
* </p>
*
*
* @param type
* 表达式格式类型
* @return 表达式解析对象
*/
public static ExpressServiceImpl createExpressService(ExpressType type) {
if (type == ExpressType.TYPE_FIRST) {
log.debug("生成表达式,表达式前缀={}", PRE_TYPE_1);
return new ExpressServiceImpl(PRE_TYPE_1, SUF_STR);
} else {
return new ExpressServiceImpl(PRE_TYPE_2, SUF_STR);
}
}
public Object expressParse(String express, Object data) throws Exception {
log.debug("解析表达式信息={}", express);
Expression expression = spelExpressionParser.parseExpression(express, this.parserContext);
return expression.getValue(evaluationContext, data);
}
}
执行动态代码调用:
public class Test {
public String exec(String para) {
return para;
}
public static void main(String[] args) {
HashMap<String,String> map = new HashMap<>();
map.put("name","12");
map.put("mobile","13035353526");
ExpressService express = ExpressServiceImpl.createExpressService(null);
try {
System.out.println("mobile="+express.expressParse("#{new Test().exec(mobile)}", map));
System.out.println("name="+express.expressParse("#{new Test().exec(name)}", map));
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
要执行的方法时要有new才能够执行,如执行上面的字符串: new Test().exec(name) 方法。