简单读Ognl源码、梳理Ognl表达式处理流程

Ognl非常高效易用,使用简单的字符串即可给对象或属性赋值[鼓掌],广泛应用于Struts、Mybatis等开源组件。

//建OgltModel类,添加私有属性id

OgltModel ogltModel = new OgltModel();

Object tree = Ognl.parseExpression("id=10");

Ognl.getValue(tree, ogltModel);

但是看到如下源码,大家是不是有些懵圈[晕],这里有些是通过JavaCC生成的,看不懂完全可以跳过,只找关键节点。

了解之前先做些技术准备:

1.2进制、8进制、10进制、16进制之间的转换。

2.Java的运算符及优先级

3.了解ASCII编码(见尾图)。

4.了解一点JavaCC。

抛开JavaCC自动收生成的,还有复杂的位运算,以id=10为例一起走下流程:



1.Ognl先定义匹配的运算符关键字(OgnlParserConstants)和对应关键字处理的特定类(OgnlParserTreeConstants对应AST开头的实现类)





2.将不同的运算符和优先级定义为14级,分别进行处理,id=10这个表达式属于赋值运算符最终会走assignmentExpression这个方法。

3.连续读取有效字符(这些无效:9水平制表符 、10换行键、12换页键、13回车键 、32空格)

jj_ntk->getNextToken,先读i,i是in关键字的开头所以会进(jjMoveStringLiteralDfa1_0)读d,d不是关键字,继续读下一个,当读到=时


跳出,得到一个token:id


继续读下一个=,是关键字


继续下一个读到1,数字不处理直接返回,得到token:=

生成ASTAssign,并继续

读1读0都不是关键字,直到读完


此时jjtree有两个node


最终生成了ASTAssign对象,两个node


最后就是赋值和取值。

到这里Ognl大致的过程

1.匹配关键字。

2.根据关键字找对应的解析类。

3.解析表达式并组装解析类需要的节点生成语法树。

4.对组装的对象进行get、set。

Ognl里面复杂的匹配过程和字节的读取非常值得推演,学习JavaCC也可以自定义表达式的匹配,一些太过复杂的东西大家可以跳过,不能钻牛角尖[白眼],我想这里的一些语法是自动生成的,不需要太深究,深陷其中反而得不偿失,理解其中的过程即可[中国赞]。

展开阅读全文

页面更新:2024-03-05

标签:表达式   赋值   优先级   节点   语法   源码   开头   属性   流程   关键字   对象   过程   简单

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top