规则引擎架构-基于aviator

10 篇文章 2 订阅
订阅专栏

aviator使用场景

github地址: aviator

Aviator的特性

  • 支持大部分运算操作符,包括算术操作符、关系运算符、逻辑操作符、正则匹配操作符(=~)、三元表达式?: ,并且支持操作符的优先级和括号强制优先级,具体请看后面的操作符列表。
  • 支持函数调用和自定义函数
  • 支持正则表达式匹配,类似Ruby、Perl的匹配语法,并且支持类Ruby的$digit指向匹配分组。
  • 自动类型转换,当执行操作的时候,会自动判断操作数类型并做相应转换,无法转换即抛异常。
  • 支持传入变量,支持类似a.b.c的嵌套变量访问。
  • 性能优秀

Aviator的限制:

  • 没有if else、do while等语句,没有赋值语句,仅支持逻辑表达式、算术表达式、三元表达式和正则匹配。
  • 没有位运算符

ASM 字节码操控框架

asm实现:直接修改或生成.class

在这里插入图片描述

在这里插入图片描述

例子代码

package com.googlecode.aviator;

import com.googlecode.aviator.asm.ClassWriter;
import com.googlecode.aviator.asm.MethodVisitor;
import com.googlecode.aviator.asm.Opcodes;

/**
 * @author dingqi on 2023/5/29
 * @since 1.0.0
 */
public class TestAsm extends ClassLoader{
    /**
     * 生成一个Class类
     * public class User {
     *
     *     public static void main(String[] args) {
     *         System.out.println("Hello World");
     *     }
     *
     *     public int add(int a, int b){
     *         return a + b;
     *     }
     * }
     */
    public static byte[] generateClazz() {
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);

        cw.visit(
                Opcodes.V1_7,
                Opcodes.ACC_PUBLIC,
                "com/googlecode/aviator/User",
                null,
                "java/lang/Object",
                null
        );

        MethodVisitor mv = cw.visitMethod(
                Opcodes.ACC_PUBLIC,
                "<init>",
                "()V",
                null,
                null
        );
        // 开始访问方法code
        mv.visitCode();
        // 局部变量进栈
        mv.visitVarInsn(Opcodes.ALOAD, 0);
        // 执行特殊实例方法(构造方法)
        mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
        // 方法返回
        mv.visitInsn(Opcodes.RETURN);
        // 最大栈大小值、最大方法本地参数值
        mv.visitMaxs(1, 1);
        // 方法结束
        mv.visitEnd();

        mv = cw.visitMethod(
                Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC,
                "main",
                "(Ljava/lang/String;)V",
                null,
                null
        );
        // 开始访问方法code
        mv.visitCode();
        // 访问static类字段out,参数类型Ljava/io/PrintStream;
        mv.visitFieldInsn(
                Opcodes.GETSTATIC,
                "java/lang/System",
                "out",
                "Ljava/io/PrintStream;"
        );
        // 常量加载进栈
        mv.visitLdcInsn("Hello World");
        // 调用对象的实例方法println,方法参数String数组(Ljava/lang/String;)V
        mv.visitMethodInsn(
                Opcodes.INVOKEVIRTUAL,
                "java/io/PrintStream",
                "println",
                "(Ljava/lang/String;)V"
        );
        // 方法返回
        mv.visitInsn(Opcodes.RETURN);
        // 最大栈大小值、最大方法内本地参数值
        mv.visitMaxs(2, 1);
        // 方法结束
        mv.visitEnd();

        // 再添加方法
        mv = cw.visitMethod(
                Opcodes.ACC_PUBLIC,
                "add",
                "(II)I",
                null,
                null
        );
        // 入参
        mv.visitVarInsn(Opcodes.ILOAD,1);
        mv.visitVarInsn(Opcodes.ILOAD,2);
        mv.visitInsn(Opcodes.IADD); //2个int类型相加
        //返回int 类型
        mv.visitInsn(Opcodes.IRETURN);
        // 设置操作数栈的深度和局部变量的大小:2个数计算,加上this 总共3个变量
        mv.visitMaxs(2, 3);
        mv.visitEnd();

        cw.visitEnd();
        return cw.toByteArray();
    }

    public static void main(String[] args) throws Exception {
        TestAsm testAsm = new TestAsm();
        byte[] code = TestAsm.generateClazz();
        String className = "com.googlecode.aviator.User";
        Class<?> clazz = testAsm.defineClass(className, code, 0, code.length);
        clazz.getMethods()[0].invoke(null, new Object[]{null});

        Object o = clazz.newInstance();
        Integer ans = (Integer)clazz.getMethods()[1].invoke(o, 1, 2);
        System.out.println("add ans:" + ans);
        ans = (Integer)clazz.getMethods()[1].invoke(o, 1, 3);
        System.out.println("add ans:" + ans);
    }

}
/** 输出
 Hello World
 add ans:3
 add ans:4
 */

aviator 表达式例子

public class AviatorEvaluatorInstanceUnitTest {

  protected AviatorEvaluatorInstance instance;

  @Before
  public void setup() {
    this.instance = AviatorEvaluator.newInstance();
  }

  @Test
  public void testExec() {
    String exp1 = "b-c+a";
    assertEquals(8, this.instance.exec(exp1, 6, 2, 4));
  }

}

debug

在这里插入图片描述
新生成了一个类Script_1685399425946_58
在这里插入图片描述

执行execute0方法,参数:com.googlecode.aviator.utils.Env
在这里插入图片描述
然后执行成功,得到结果
在这里插入图片描述
debug可以看到生成的类确实有方法:public final java.lang.Object Script_1685400413476_58.execute0(com.googlecode.aviator.utils.Env)
在这里插入图片描述

表达式类生成过程

依据

String exp1 = "b-c+a";
assertEquals(8, this.instance.exec(exp1, 6, 2, 4));

在这里插入图片描述
解析完变量后的asm生成逻辑:
在这里插入图片描述
在这里插入图片描述

 private void callASM(final Map<String, VariableMeta/* metadata */> variables,
      final Map<String, Integer/* counter */> methods, final Set<Token<?>> constants) {
    this.codeGen.initConstants(constants);
    this.codeGen.initVariables(variables);
    this.codeGen.initMethods(methods);
    this.codeGen.setLambdaBootstraps(this.lambdaBootstraps);
    this.codeGen.start();


生成execute0方法

 @Override
  public void start() {
    makeConstructor();
    startVisitMethodCode();
  }
private void startVisitMethodCode() {
    this.mv = this.classWriter.visitMethod(ACC_PUBLIC + +ACC_FINAL, "execute0",
        "(Lcom/googlecode/aviator/utils/Env;)Ljava/lang/Object;",
        "(Lcom/googlecode/aviator/utils/Env;)Ljava/lang/Object;", null);
    this.mv.visitCode();
  }

在这里插入图片描述

可以debug写到class文件查看, className文件名Script_1685767852489_58
在这里插入图片描述

b-c+a生成的class文件
public class Script_1685767852489_58 extends ClassExpression {
    private final AviatorJavaType f0;
    private final AviatorJavaType f1;
    private final AviatorJavaType f2;

    public Script_1685767852489_58(AviatorEvaluatorInstance var1, List var2, SymbolTable var3) {
        super(var1, var2, var3);
        this.f2 = new AviatorJavaType("a", var3);
        this.f0 = new AviatorJavaType("b", var3);
        this.f1 = new AviatorJavaType("c", var3);
    }

    public final Object execute0(Env var1) {
        return this.f0.sub(this.f1, var1).add(this.f2, var1).getValue(var1);
    }
}

参数通过构造函数设置好,然后一个exceute0方法内部就是执行b-c+a的逻辑

【微服务】springboot 整合表达式计算引擎 Aviator 使用详解
congge
08-18 8939
springboot 整合表达式计算引擎 Aviator 使用详解
Aviator规则引擎
08-07
NULL 博文链接:https://huangjiateng.iteye.com/blog/2110519
Aviator 规则引擎介绍
huanghuang9426的博客
06-16 1万+
规则引擎介绍简介和使用
规则引擎Aviator实践分享
fuliyingIT的博客
11-06 4420
本文对比了市面较火的规则引擎:drools,easyrules,urule,aviator详述他们的优缺点,及应用案例。
规则引擎之--Google Aviator
TaylorSwiftRed的博客
12-04 3401
规则引擎,如drools、Groovy、Aviator、Easy-rules、LiteFlow。这些规则引擎各有优势,在我们项目中,是使用的Google 的Aviator,使用下来发现,有几个比较明显的优点:1.引入方便,不需要多余的配置2.对于业务无入侵,结构比较轻巧Aviator的设计目标是轻量级和高性能。
基于Aviator规则引擎系统设计
weixin_33755649的博客
05-08 5051
项目里或多或少的都会有一些基于规则判断的代码,而往往这部分逻辑判断代码都写在项目里,改规则就得改代码,所以就很不方便,而且随着规则越多,代码越繁杂。最近有时间,设计了一套基于Aviator规则引擎系统。参考文档:https://code.google.com/archive/p/aviator/wikis/User_Guide_zh.wiki 规则引擎...
springboot ice规则引擎
09-24
Easy Rules,Drools,Aviator表达式求值引擎,Rule Book、Oracle Rules SDK、Blaze (fico)、IBM Decision Manager,DTRules,DSL规则引擎 规则引擎由三部分 事实(Fact):已知对象,比如以上刷卡的行为,即成事实...
基于Aviator规则引擎Demo
禅鸣之时
04-30 4609
  编写不易,转载请注明(http://shihlei.iteye.com/blog/2421576)!   一 概述 Aviator 是一个Java 语言实现的表达式引擎,可以接受字符串类型的表达式,带入参数求值。   需求场景: 用户日志字段:[ip,phone,userid,action]   希望灵活组合这些字段,生成规则,比如 “1小时,userid,在ip上,触发...
aviator-5.2.6-API文档-中文版.zip
07-14
赠送jar包:aviator-5.2.6.jar; 赠送原API文档:aviator-5.2.6-javadoc.jar; 赠送源代码:aviator-5.2.6-sources.jar; 赠送Maven依赖信息文件:aviator-5.2.6.pom; 包含翻译后的API文档:aviator-5.2.6-javadoc-...
aviator java,基于Aviator规则引擎系统设计
weixin_39887715的博客
03-18 377
项目里或多或少的都会有一些基于规则判断的代码,而往往这部分逻辑判断代码都写在项目里,改规则就得改代码,所以就很不方便,而且随着规则越多,代码越繁杂。最近有时间,设计了一套基于Aviator规则引擎系统。参考文档:https://code.google.com/archive/p/aviator/wikis/User_Guide_zh.wiki规则引擎需求:1、每个规则有一个大的通用规则设置,对应...
万字+28张图带你探秘小而美的规则引擎框架LiteFlow
weixin_45630885的博客
05-16 2052
大家好,今天给大家介绍一款轻量、快速、稳定可编排的组件式规则引擎框架LiteFlow。 一、LiteFlow的介绍 LiteFlow官方网站和代码仓库地址 官方网站:https://yomahub.com/liteflow Gitee托管仓库:https://gitee.com/dromara/liteFlow Github托管仓库:https://github.com/dromara/liteflow 前言 在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻...
Aviator规则引擎保姆级教程
Faithfeng的博客
09-09 7059
你的业务项目是否有很多规则需要判断?规则是否经常变动?如果全部用代码开发是不是每次变动都需开发人员改动代码逻辑,重新编译、部署上线?是不是觉得非常繁琐麻烦?本文推荐使用aviator规则引擎来处理此类场景的问题,做到规则可动态配置、自定义函数、无需打包重启程序。本文主要讲解aviator的基本使用以及他的各种函数如何调用当官方函数不满足的情况下,可以自定义函数(非常好用!!!)自定义函数有好几种方法,本文主要讲解其中两种。
基于Aviator开发一个简单的规则引擎
zhanghailang1的博客
03-24 2860
Aviator表达式实现一个轻量级的业务规则引擎
表达式引擎Aviator基本介绍及使用以及基于Aviator规则引擎(附代码详细介绍)
热门推荐
弹弹霹雳的博客
07-18 3万+
1. Avaitor 1.1 什么是Avaitor? Aviator是一门高性能、轻量级的Java语言实现的表达式求值引擎,主要用于表达式的动态求值。 1.2 为什么需要Avaitor? Aviator的设计目标是 轻量级 和 高性能 ,相对于Groovy、JRuby的笨重,Aviator非常小,加上依赖包就450K,不算依赖包就70K,不过Aviator的语法受限,它并不是一门完整的语言,只是语言的一小部分集合。 1.3 Avaitor的特点 Aviator的实现思路与其它轻量级的求值器不同,其它求值器是
规则引擎架构设计与系统实现
qq_30615201的博客
12-17 1万+
ruleEngine 业务规则、配置化编程、政策引擎、规则引擎 目录 ruleEngine 1. 背景 2. 方案考察 2.1. 硬编码: 2.2. Drools: 2.3. Urule: 2.4. 自研规则引擎 3. 能力要求 4. 名词解释 5. 概要设计 5.1. 功能模块划分 5.1.1. 公式推理器Calculator: 5.1.2. 指标解析器FormulaExecuter: 5.1.3. 动作执行器ActionExecuter: 5.1.4. 模型执行器.
Aviator规则引擎
sasa527的专栏
11-28 569
Aviator规则引擎
规则引擎-Aviator 表达式校验是否成立
最新发布
Apollo
06-25 959
Aviator是一个轻量级、高性能的Java表达式执行引擎,它动态地将表达式编译成字节码并运行。
基于Aviator的注解驱动验证框架
GaaraZhu的专栏
08-25 1915
程序开发过程中,在同一系统中层层之间数据传递或者是异构系统之间同步异步通信的时候,我们经常需要对Java Bean进行属性验证,来决定是否继续后续process,或者直接抛出error message。         传统的做法,给每个验证场景加一个验证类,专门负责所有属性的验证,以及验证结果的校验和处理,这种做法最直白,但是不够灵活。第二种就是Java 6自带的验证框架 Bean valid
写文章

热门文章

  • hadoop 各种概念整理 46951
  • cocos2d-x lua 贪吃蛇完整项目 19020
  • lua 调用.so 和 require 使用 17784
  • Unity5.4.1 Scroll_View的简单使用 16734
  • C++ 类成员函数的重载(overload),重写/覆盖(override),隐藏 15257

分类专栏

  • 项目经验总结 16篇
  • 规则引擎 10篇
  • 函数式编程 2篇
  • Java 41篇
  • Java-web框架-mvc-ssh-ssm 6篇
  • 限流 2篇
  • druid.io 20篇
  • hadoop/hive/hbase 15篇
  • spark 1篇
  • kafka 8篇
  • 刷题
  • 左神程序员代码面试指南 1篇
  • 剑指 offer 1篇
  • python 8篇
  • 开发工具技能 21篇
  • 数据处理和分析 2篇
  • 大数据相关 3篇
  • 数据库-关系型-非关系型 22篇
  • Linux & 计算机基础 39篇
  • 操作系统 13篇
  • 网络 14篇
  • makefile 3篇
  • shell 5篇
  • 浙大PAT&基础算法 9篇
  • 字符串 26篇
  • 数学-组合 28篇
  • 动态规划 19篇
  • 递归优化/大数处理 8篇
  • 模拟题 21篇
  • C++STL应用 34篇
  • 各种二叉树 36篇
  • 哈夫曼树应用 1篇
  • Dijkstra Floyd 9篇
  • 图论-BFS-DFS应用 30篇
  • 回溯-剪枝 8篇
  • prime-kruskal(并查集) 7篇
  • 并查集 11篇
  • 拓扑-AOE网 5篇
  • 查找-排序-二分 28篇
  • 倒排索引
  • hash 散列 map等 2篇
  • 贪心-暴破-枚举 6篇
  • 递归-各种类递归方法 4篇
  • 字典树-线段树 5篇
  • 博弈论 1篇
  • 分治/链表/O(n) 7篇
  • PAT超时问题 1篇
  • C C++ 数据结构 32篇
  • C++ 40篇
  • 各种开发
  • Nginx-Lua 7篇
  • cocos2d-x c++ lua 11篇
  • Cocos2dx -- Unity3D 18篇
  • OpenGL 12篇
  • Android开发 15篇
  • web-webservice 6篇
  • css-js 11篇
  • 随笔 11篇

最新评论

  • 读余华小说《兄弟》

    master_bro: 我对大人的敬仰之情,犹如滔滔江水,绵延不绝

  • druid.io 优化 Coordinator SQLMetadataSegmentManager【工作总结】

    doufh88: 关注申请查看

  • 规则引擎--规则集:规则集合的组织和执行

    master-dragon: 【规则引擎--规则逻辑形如“1 & (2 | 3)“的抽象设计 - CSDN App】http://t.csdnimg.cn/RwWF0 自定义的,源码在这篇里面。 评论的这篇只是为了阐述下规则集:规则的一些组合

  • 规则引擎--规则集:规则集合的组织和执行

    weixin_38671006: RuleResult类找不到,代码不全啊

  • Java类加载器不同导致SPI加载报错: Provider ... not a subtype

    记得.zZ: 为什么会出现这种原因呢?

大家在看

  • 问:数据库并发控制→隔离级别
  • Java | Leetcode Java题解之第502题IPO 186
  • Python | Leetcode Python题解之第502题IPO 100
  • 数据处理和分析之数据聚类:K-means聚类:K-means算法原理与应用 1219
  • C++ | Leetcode C++题解之第503题下一个更大元素II

最新文章

  • 抽象一个通用的配置冲突解决方案
  • FutureTask的测试使用和方法执行分析
  • Aqs独占/共享模式
2024年1篇
2023年26篇
2022年6篇
2021年13篇
2020年44篇
2019年28篇
2018年27篇
2017年81篇
2016年234篇
2015年189篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家河源艺术雕塑玻璃钢清远玻璃钢雕塑产品介绍玻璃钢鹿雕塑原理玻璃钢动物雕塑价格范围玻璃钢雕塑怎么修补福建商业商场美陈厂家供应吉林玻璃钢孙悟空雕塑厂芒市玻璃钢雕塑加工金昌玻璃钢雕塑供应商玻璃钢十二生肖雕塑珠海会发光的玻璃钢雕塑太原学校玻璃钢雕塑定制河南商场美陈生产厂家玻璃钢仿铜蜗牛雕塑临沧市玻璃钢雕塑价位商场通道美陈画面玻璃钢卡通雕塑的特点三明玻璃钢卡通雕塑厂家高要玻璃钢花盆花器江苏戏曲玻璃钢脸谱雕塑定制福建户外商场美陈供货商红色玻璃钢雕塑销售厂做玻璃钢雕塑联系方式保定玻璃钢造型雕塑批发怎么提高商场陈列美陈云浮工艺玻璃钢人物雕塑浙江省玻璃钢人物雕塑商丘玻璃钢雕塑定制云南户内玻璃钢雕塑销售电话洛阳肇庆玻璃钢动物雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化