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() ));
}
}
分享到:
相关推荐
在解析表达式时,编译器会检查表达式的语法是否正确,解释器则在运行时计算表达式的结果。 4. **Java的表达式类型**: - **算术表达式**: 包含数字、运算符(+,-,*,/,%)和括号,用于执行基本的数学运算。 - *...
Java表达式解析是编程中的一个重要概念,特别是在设计编译器、解释器或脚本引擎时。...同时,也可以参考已有的开源项目,如`JEXL`或`Ognl`,它们是成熟的Java表达式语言实现,可以从中学到很多实用技巧。
这些代码可能包含一个自定义的解析器和求值器,或者使用了已有的库如`javax.eval.Evaluator`(Java 6及以上版本)或开源项目如JEXL (Java Expression Language)。 `lib`目录可能包含了用于这个任务的外部库,例如,...
以上就是关于Jexl的详细介绍,它作为一个强大的Java表达式工具,为开发人员提供了灵活的表达式计算和Java Bean属性访问能力,使得动态逻辑的实现更加简单高效。在实际开发中,Jexl可以大大提高代码的可维护性和可...
JEXL引擎会解析表达式并生成一个`Script`对象,然后执行这个脚本,返回表达式的计算结果。 例如,如果你想验证`num`是否在70到90之间,你可以这样调用: ```java Map, Integer> context = new HashMap(); context....
5. **AST(Abstract Syntax Tree)**: 在解析表达式后,Jexl会构建一个抽象语法树,这是编译原理中的常见概念,用于表示表达式的结构。在Jexl源码中,你可以看到一系列以`JexlNode`为基类的类,它们代表了AST的不同...
总的来说,这个程序是一个实用的工具,它展示了如何用Java实现对数学表达式的解析和计算。通过学习这个程序,开发者不仅可以加深对Java编程的理解,还能掌握编译原理中的重要概念,这对于提升编程技能和解决问题能力...
Jexl3(Java Expression Language 3)是一个强大的、开源的脚本语言库,主要用于在Java应用程序中执行动态表达式。它允许开发者在运行时创建和执行复杂的逻辑和计算,极大地增强了代码的灵活性。Jexl3.0是这个库的一...
1. `src/main/java`: 这是源码的主要目录,包含了Jexl的各个组件和类,如表达式解析器、执行引擎、上下文管理等。 2. `src/test/java`: 存放了单元测试代码,通过这些测试可以了解Jexl的使用方法和功能边界。 3. `...
**Jexl:Java Expression Language库的全面解析** Jexl是Apache软件基金会的一个开源项目,全称为Java Expression Language,它提供了一种简洁的方式来在Java应用程序中执行动态表达式。这个库特别适用于需要进行...
Apache Commons JEXL,全称为Java Expression Language,是Apache软件基金会的一个开源项目,旨在提供一个简单易用的JavaScript Expression Language(JEXL)实现。这个库允许你在Java应用程序中执行动态脚本,使得...
7. **性能优化**:由于JEXL是编译到Java字节码的,因此其执行速度比解析和解释表达式的其他脚本引擎更快。 8. **灵活性**:JEXL适用于多种场景,如配置文件、模板引擎、事件驱动的逻辑等。 在下载的JEXL实例中,...
Apache Commons JEXL,全称Java Expression Language,是Apache软件基金会下的一个开源项目,提供了一个强大的、灵活的脚本语言引擎,用于在Java应用程序中执行JavaScript风格的表达式。在本文中,我们将深入探讨这...
有一些第三方库,如`JEXL (Java Expression Language)`或`Ognl (Object-Graph Navigation Language)`,它们提供了解析和执行表达式的能力。这些库通常支持简单的数学运算、逻辑判断以及对Java对象的操作,可以用来...
9. **表达式解析库**:对于更复杂的表达式,开发者可能会选择使用第三方库,如JEXL(Java Expression Language)或Ognl(Object-Graph Navigation Language),它们提供了强大的表达式解析和执行功能。 在提供的...
在`jxls`中,JEXL被用来解析和执行Excel模板中的表达式,这些表达式可以引用Java对象的属性,进行条件判断,甚至调用方法。例如,你可以在单元格中写入`${users}" var="user">${user.name}</jx:each>`,这将在Excel...
在jxls中,它用于解析和执行在Excel模板中的JEXL表达式,实现数据的动态计算和过滤。 5. **slf4j-api-1.7.25.jar**: Simple Logging Facade for Java (SLF4J) 是一个日志抽象层,为各种日志框架提供统一的接口,如...
对于更复杂的表达式,例如涉及括号、函数(如sin、cos)等,可能需要使用第三方库,如Apache Commons Math或JEXL(Java Expression Language)。 下面是一个简单的例子,展示了如何使用Java处理简单的字符串公式: ...
`jxls`依赖于`commons-jexl`来解析和执行模板中的JEXL表达式,例如,根据条件设置单元格的值,或者对数据进行计算。 3. **使用步骤**: - **创建模板**:首先,创建一个Excel模板,其中包含动态内容和JEXL表达式。...