boolex包可以把它理解为就是一个处理“是”“非”的地方,我的输入是一个表达式输出是一个true或者false。logback实现这个功能提供了两个对象,一个是ch.qos.logback.core.boolex.Matcher对象,用来处理简单的正则匹配,底层封装了java.util.regex.Pattern对象。另一个是ch.qos.logback.core.boolex.JaninoEventEvaluatorBase对象,用来计算复杂的处理逻辑,底层封装了org.codehaus.janino.ScriptEvaluator对象。想深入了解java.util.regex.Pattern和org.codehaus.janino.ScriptEvaluator两个对象的可以参考网络其他文章学习,这里只给两个简单的例子参考
package com.logback.boolex; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.codehaus.janino.ScriptEvaluator; public class BoolexMain { public static void main(String[] args) { try { //1、简单的正则匹配 String regex="阴阳"; String content="阴阳八卦"; /*正则匹配三部曲*/ Pattern pattern=Pattern.compile(regex);//第一步:编译正则 Matcher matcher=pattern.matcher(content);//第二步:内容计算匹配 boolean reuslt=matcher.find();//第三步:获取匹配结果 System.out.println("简单的正则匹配:"+reuslt); //打印结果>>简单的正则匹配:true //2、复杂的计算逻辑 ScriptEvaluator scriptEvaluator2=new ScriptEvaluator( "return a.equals(b);",//运行的脚本 boolean.class,//返回结果类型 new String[] {"a","b"},//定义变量 new Class[] {String.class,String.class}//定义变量类型 ); System.out.println("复杂的计算逻辑:"+scriptEvaluator2.evaluate(new String[] {"R","R"})); //打印结果>>复杂的计算逻辑:true } catch (Exception e) { e.printStackTrace(); } } }
1、ch.qos.logback.core.boolex.Matcher类:判断是非的核心方法是matches(input: java.lang.String)。这个类比较简单就是封装了java.util.regex.Pattern对象,并调用了该对象的compile(),matches(),find()等方法,具体接口如图

2、ch.qos.logback.core.boolex.JaninoEventEvaluatorBase<E>抽象类:判断是非的核心方法是evaluate(event: E)。这个类封装了java.util.regex.Pattern和org.codehaus.janino.ScriptEvaluator对象,ScriptEvaluator对象的正常使用必须提供 表达式(Expression) 、变量集合(ParameterNames),返回类型(EXPRESSION_TYPE)、参数类型集合(ParameterTypes)、要传入的参数值集合(ParameterValues)等五要素。其中返回类型(EXPRESSION_TYPE)是确定要的就是boolean类型。所以要正常使用evaluate(event: E)方法,其他四要素必须由子类提供。这就是为什么ch.qos.logback.core.boolex.JaninoEventEvaluatorBase抽象类要抽象出来
abstract protected String getDecoratedExpression(); abstract protected String[] getParameterNames();
abstract protected Class<?>[] getParameterTypes(); abstract protected Object[] getParameterValues(E event);四个方法的原因。具体接口如下:

3、ch.qos.logback.core.boolex.EvaluationException类:继承自java.lang.Exception类。调用 ch.qos.logback.core.boolex.EventEvaluator接口evaluate(event: E)方法抛出的异常统一转化为ch.qos.logback.core.boolex.EvaluationException异常并抛出。类图

4、小结:到这里ch.qos.logback.core.boolex包下的类基本就讲完了,最后给大家一个直观的例子,加深基础知识的理解。
a、创建传值的对象AddObj
package com.logback.boolex; //保存a和b的值 public class AddObj { private int a; private int b; public int getA() { return a; } public void setA(int a) { this.a = a; } public int getB() { return b; } public void setB(int b) { this.b = b; } }
b、创建NumAddNumEqFour对象继承ch.qos.logback.core.boolex.JaninoEventEvaluatorBase<AddObj>对象
package com.logback.boolex; import ch.qos.logback.core.boolex.JaninoEventEvaluatorBase; public class NumAddNumEqFour extends JaninoEventEvaluatorBase<AddObj> { @Override protected String getDecoratedExpression() { return "return 4==a+b;"; } @Override protected String[] getParameterNames() { return new String[] {"a","b"}; } @Override protected Class<?>[] getParameterTypes() { return new Class[] {Integer.class,Integer.class}; } @Override protected Object[] getParameterValues(AddObj event) { return new Integer[] {event.getA(),event.getB()}; } }
c、main方法
package com.logback.boolex; import ch.qos.logback.core.boolex.Matcher; public class BoolexMain2 { public static void main(String[] args) { try { //1、ch.qos.logback.core.boolex.Matcher 使用 Matcher matcher=new Matcher(); matcher.setName("正则匹配器"); matcher.setRegex("nihao"); matcher.start(); System.out.println(matcher.matches("eeenihaoma"));//打印:true //2、ch.qos.logback.core.boolex.JaninoEventEvaluatorBase<E>对象使用 AddObj addObj=new AddObj(); addObj.setA(2);addObj.setB(2); NumAddNumEqFour myJaninoEventEvaluatorBase=new NumAddNumEqFour(); myJaninoEventEvaluatorBase.start(); boolean result=myJaninoEventEvaluatorBase.evaluate(addObj); System.out.println("2+2等于4? 答案:"+result);//打印:2+2等于4? 答案:true addObj.setA(3);addObj.setB(2); result=myJaninoEventEvaluatorBase.evaluate(addObj); System.out.println("3+2等于4? 答案:"+result);//打印:3+2等于4? 答案:false } catch (Exception e) { e.printStackTrace(); } } }
浙公网安备 33010602011771号