读书人

java解析表达式JEXL兑现办法

发布时间: 2012-08-24 10:00:20 作者: rapoo

java解析表达式JEXL实现办法

1. FormulaCalculator类

?

package test;import java.util.Map;import org.apache.commons.jexl.Expression;import org.apache.commons.jexl.ExpressionFactory;import org.apache.commons.jexl.JexlContext;public class FormulaCalculator {String _formula;JexlContext _jexlContext;Map _varMap;public FormulaCalculator(){_jexlContext = new JexlContext(){public Map getVars() {return _varMap;}public void setVars(Map vars) {_varMap.clear();_varMap.putAll( vars );}};}public void setFormula(String formula) throws Exception{validateFormula( formula );_formula = formula;}public void setVars(Map<String, Number> vars){_varMap = vars;}public Number calculate() throws Exception{Expression e = ExpressionFactory.createExpression( _formula );return (Number) e.evaluate( _jexlContext );}private void validateFormula( String formula ) throws Exception{// FIXME: implementation}}

?

?

2. 测试类

?

package test;import java.util.HashMap;import java.util.Map;import junit.framework.TestCase;import org.junit.Assert;public class FormulaCalculatorTest extends TestCase{public void testCalculate() throws Exception{String formula = "3+2";FormulaCalculator cal = new FormulaCalculator();cal.setFormula(formula);cal.setVars(null);Number n = cal.calculate();Assert.assertEquals( 5, Integer.parseInt( n.toString() ));String formula2 = "n1+n2+3";cal.setFormula(formula2);Map<String, Number> mapVars = new HashMap<String, Number>();mapVars.put( "n1", 2);mapVars.put( "n2", 3);cal.setFormula( formula2);cal.setVars( mapVars);Number n2 = cal.calculate();Assert.assertEquals(8, Integer.parseInt( n2.toString() ));}}

?

?

读书人网 >编程

热点推荐