秒懂java規(guī)則表達(dá)式框架

背景

在我們的業(yè)務(wù)場景中有一個需求,我們有一個配置功能,該功能需要配置兩個變量之間比較大小。使用tab比較難表達(dá),所以就提出了,可以讓用戶寫比較簡單的函數(shù)進(jìn)行配置?;蛘哌xtab進(jìn)行選擇(前段直接將對應(yīng)的tab字符串拼接來給后端執(zhí)行)。

或者這么說吧,可以通過字符串的表達(dá)的意思,進(jìn)行執(zhí)行這個字符串的索要表達(dá)的邏輯,且這個邏輯和這個字符串可以自定義。

Aviator

簡介

Aviator是一個高性能、輕量級的java語言實(shí)現(xiàn)的表達(dá)式求值引擎,主要用于各種表達(dá)式的動態(tài)求值。現(xiàn)在已經(jīng)有很多開源可用的java表達(dá)式求值引擎,為什么還需要Avaitor呢?

Aviator的設(shè)計(jì)目標(biāo)是輕量級和*高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小,加上依賴包也才450K,不算依賴包的話只有70K;當(dāng)然,Aviator的語法是受限的,它不是一門完整的語言,而只是語言的一小部分集合。

其次,Aviator的實(shí)現(xiàn)思路與其他輕量級的求值器很不相同,其他求值器一般都是通過解釋的方式運(yùn)行,而Aviator則是直接將表達(dá)式*編譯成Java字節(jié)碼,交給JVM去執(zhí)行。簡單來說,Aviator的定位是介于Groovy這樣的重量級腳本語言和IKExpression這樣的輕量級表達(dá)式引擎之間。

內(nèi)部原理

[if !supportLists]1.?[endif]任何語言都是通過一步一步的抽象,從硬件原理再到我們?nèi)祟惪梢哉J(rèn)識的語言。

[if !supportLists]2.?[endif]Java語言是基于JVM虛擬機(jī)抽象上來的語言,通過編譯器可以將我們寫的代碼進(jìn)行類加載后編譯為JVM可以認(rèn)識的字節(jié)碼,JVM在進(jìn)行編譯和運(yùn)行再變?yōu)槲覀儾僮飨到y(tǒng)可以運(yùn)行的代碼,直到二極管三極管可以認(rèn)識的的高低位。

[if !supportLists]3.?[endif]Aviator框架用自己規(guī)范最后也編譯為JVM虛擬機(jī)可以認(rèn)識的字節(jié)碼。


基本使用規(guī)范


代碼演示:

[if !supportLists]1.?[endif]需求:前端直接傳來一個字符串,通過這個字符串進(jìn)行相應(yīng)的邏輯計(jì)算。列入A>B 那就是將A>B的計(jì)算結(jié)果布爾值返回。

package aviator規(guī)則引擎;


import com.googlecode.aviator.AviatorEvaluator;


import java.util.Date;

import java.util.HashMap;

import java.util.Map;


/**

?* @author yuanxindong

?* @date 2020/8/9 12:50

?*/

public class AviatorDemo3 {


????public static void main(String[] args) {

????????String nameValue = "a";

????????String name1Value2 = "b";

????????String expression = nameValue + ">" + name1Value2;

????????// nameValue

????????Object execute = compareAandB(nameValue, name1Value2, expression);

????????System.out.println(execute);

????}


????private static Object compareAandB(String A, String B, String expression) {

????????Date dateTime = new Date();

????????Date dateTime2 = new Date();

????????Map<String, Object> map = new HashMap<>(4);

????????map.put(A, dateTime);

????????map.put(B, dateTime2);

????????return AviatorEvaluator.execute(expression, map);

????}


}

需求2. 設(shè)計(jì)一個根據(jù)付款金額決定是否發(fā)送優(yōu)惠券的規(guī)則表達(dá)式

package aviator規(guī)則引擎;


import com.googlecode.aviator.AviatorEvaluator;


import java.util.Date;

import java.util.HashMap;

import java.util.Map;


/**

?* @author yuanxindong

?* @date 2020/8/9 12:50

?*/

public class AviatorDemo3 {


????public static void main(String[] args) {

????????String nameValue = "a";

????????String name1Value2 = "b";

????????String expression = nameValue + ">" + name1Value2;

????????// nameValue

????????Object execute = compareAandB(nameValue, name1Value2, expression);

????????System.out.println(execute);

????}


????private static Object compareAandB(String A, String B, String expression) {

????????Date dateTime = new Date();

????????Date dateTime2 = new Date();

????????Map<String, Object> map = new HashMap<>(4);

????????map.put(A, dateTime);

????????map.put(B, dateTime2);

????????return AviatorEvaluator.execute(expression, map);

????}


}



需求3:

1)設(shè)計(jì)

業(yè)務(wù)需求:

“1小時,userid,在ip上,觸發(fā)action 100次報(bào)警”

表達(dá)式設(shè)計(jì):

“redisCount(‘1’,‘hour’,fields(‘userid,ip,action’)) >= 100”

函數(shù)說明:

fields() : 獲取字段,校驗(yàn),生成redis key

redisCount():使用 key進(jìn)行查詢,獲取redis中存的量且redis +1



package aviator規(guī)則引擎;


import com.googlecode.aviator.AviatorEvaluator;


import java.util.Date;

import java.util.HashMap;

import java.util.Map;


/**

?* @author yuanxindong

?* @date 2020/8/9 12:50

?*/

public class AviatorDemo3 {


????public static void main(String[] args) {

????????String nameValue = "a";

????????String name1Value2 = "b";

????????String expression = nameValue + ">" + name1Value2;

????????// nameValue

????????Object execute = compareAandB(nameValue, name1Value2, expression);

????????System.out.println(execute);

????}


????private static Object compareAandB(String A, String B, String expression) {

????????Date dateTime = new Date();

????????Date dateTime2 = new Date();

????????Map<String, Object> map = new HashMap<>(4);

????????map.put(A, dateTime);

????????map.put(B, dateTime2);

????????return AviatorEvaluator.execute(expression, map);

????}


}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容