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();
            }
        }
}