JAVA 动态执行字符串代码

用到的相关类:

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) 方法。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页