通过一个示例,调试查看程序中间经历的步骤
public class SpringELTest { public static void main(String[] args) { // 1. 构建解析器 org.springframework.expression.ExpressionParser parser = new SpelExpressionParser(); // 2. 解析表达式 Expression expression = parser.parseExpression("100 * 2 + 400 * 1 + 66"); // 3. 获取结果 int result = (Integer) expression.getValue(); System.out.println(result); // 结果:666 } }EL表达式解析后得到表达式 (((100 * 2) + (400 * 1)) + 66)
如果用图形把其这棵AST抽象语法树简单地画出来,大概是这样
调用 expression.getValue() 求值,此时的 ast 是语法树的头结点,也就是 + OpPlus,所以通过 this.ast.getValue(expressionState) 进入了 OpPlus 的 getValue 方法(是父类中的方法),接着进入 getValueInternal 方法,然后递归计算操作符左边的值,递归计算操作符右边的值,最后相加返回
参考:
刘伟.Java设计模式
Java设计模式精讲
欢迎评论、转发、分享