Aviator是一個高性能、輕量級的 java 語言實現的表達式求值引擎, 主要用於各種表達式的動態求值。現在已經有很多開源可用的 java 表達式求值引擎,為什么還需要 Avaitor 呢?
Aviator的設計目標是輕量級和高性能,相比於Groovy、JRuby的笨重, Aviator非常小, 加上依賴包也才450K,不算依賴包的話只有 70K; 當然, Aviator的語法是受限的, 它不是一門完整的語言, 而只是語言的一小部分集合。
其次, Aviator的實現思路與其他輕量級的求值器很不相同, 其他求值器一般都是通過解釋的方式運行, 而Aviator則是直接將表達式編譯成Java 字節碼, 交給JVM去執行。簡單來說, Aviator的定位是介於Groovy這樣的重量級腳本語言和IKExpression這樣的輕量級表達式引擎 之間。
Aviator支持大部分運算操作符, 包括算術操作符、關系運算符、邏輯操作符、位運算符、正則匹配操作符(=~
)、三元表達式(?:
), 並且支持操作符的優先級和括號強制優先級, 具體請看后面的操作符列表, 支持自定義函數.
https://github.com/killme2008/aviator/wiki
還是要說,如果可以的話,可以內定一種業務偽代碼(比如可參考spring EL的一些規格),然后在打包前自己寫個工具翻譯成.java文件,運行時仍然使用的是java,這樣在效率上通常會大幅度提升,如果水平足夠好的話,采用運行時字節碼操作也未尚不可。其實這也是當下很多流程系統比如jbpm性能低下的原因之一吧。不過確實存在一個強大、但是卻沒有被廣泛宣傳的EL庫,在我們稽核的業務中,其性能和Java原生調用性能幾乎相同,采用的是java cc技術,我們將其廣泛用於序列化和反序列化場景。在此之前,我們使用了mvel2、spel,性能相比原生都是幾十倍的下降,產品開發團隊強烈要求我們框架組提供高性能版本。