规则引擎架构-基于aviator

article/2025/10/23 23:52:09

目录

    • aviator使用场景
    • ASM 字节码操控框架
    • aviator 表达式例子
      • debug
      • 表达式类生成过程
        • `b-c+a`生成的class文件

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);// 开始访问方法codemv.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);// 开始访问方法codemv.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;)Vmv.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 Worldadd ans:3add ans:4*/

aviator 表达式例子

public class AviatorEvaluatorInstanceUnitTest {protected AviatorEvaluatorInstance instance;@Beforepublic void setup() {this.instance = AviatorEvaluator.newInstance();}@Testpublic 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方法

 @Overridepublic 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的逻辑


http://chatgpt.dhexx.cn/article/d3V9QpZs.shtml

相关文章

0.1、Aviator 的使用

文章目录 前言一图胜千言Maven 依赖代码 Demo工具类和测试测试结果参考 前言 google 公司提供了一个工具包&#xff0c;可以方便的用于复杂规则的校验场景。 一图胜千言 Maven 依赖 <dependency><groupId>com.googlecode.aviator</groupId><artifactId…

JVM内存分析:Aviator低版本内存泄漏问题分析

目录 1.频繁FullGC告警 2.堆转储操作生成dump文件 3.利用MAT工具分析dump文件 3.1 大对象视图分析内存泄漏原因 3.2 Aviator框架中什么地方用到ThreadLocal&#xff1f; 3.3 fnLocal为什么存在内存泄漏&#xff1f; 3.4 LambdaFunctionBootstrap为什么没有释放&#xff…

Aviator 规则引擎介绍

先说结论&#xff1a; 规则简单&#xff1a;qlexpress或者avaitor&#xff1b;规则复杂&#xff1a;drools 最终选择是因为&#xff1a;足够轻量级&#xff0c;社区活跃度较好&#xff0c;最新jar包更新于22年4月 String expression "a河北省&&((b男人||c>3…

aviator实战

aviator规则引擎轻量、高性能可以帮我们解决很多配置规则的问题 官方文档参考&#xff1a;Aviator帮助文档 实战一把aviator&#xff0c;举个栗子 对年龄在40岁以内、职级大于等于3的“宋姓”销售人员发放提成&#xff0c; 提成计算公式“销售量 * 单件提成金额 * 10%” 代码…

aviator java,基于Aviator的规则引擎系统设计

项目里或多或少的都会有一些基于规则判断的代码&#xff0c;而往往这部分逻辑判断代码都写在项目里&#xff0c;改规则就得改代码&#xff0c;所以就很不方便&#xff0c;而且随着规则越多&#xff0c;代码越繁杂。 最近有时间&#xff0c;设计了一套基于Aviator的规则引擎系统…

Aviator源码:Aviator表达式引擎执行过程源码分析

目录 1.if执行脚本示例 2.源码分析 2.1 compile执行过程 2.1.1 CodeGenerator 2.1.2 ExpressionParser 2.1.3 if脚本ASM反编译结果 2.2 compiledExpression.execute执行过程 3.总结概述 由于Aviator支持的脚本语法较多&#xff0c;下面通过项目中使用较多的if语句来对a…

Aviator使用

“初步了解和使用Aviator” 1.Aviator简介 Aviator 是一个高性能&#xff0c;轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。 官方文档 github地址 支持数字、字符串、正则表达式、布尔值、正则表达式等基本类型&#xff0c;完整支持所有…

java aviator_Aviator 表达式求值引擎开源框架

简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎&#xff0c;为什么还需要Avaitor呢&#xff1f; Aviator的设计目标是轻量级和高性能&#xff0c;相比于Groovy、JRuby…

java aviator_Aviator——让表达式飞起来

《飞行大亨》是我很喜欢的一部电影&#xff0c;不过这里我想介绍的是一个叫Aviator的开源的Java表达式求值器。 一、轮子的必要性 表达式的求值上&#xff0c;java的选择非常多&#xff0c;强大的如Groovy、JRuby&#xff0c;N年没维护的beanshell&#xff0c;包括javaeye上朋友…

Aviator

Aviator 简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎&#xff0c;主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎&#xff0c;为什么还需要Avaitor呢&#xff1f; Aviator的设计目标是轻量级和高性能 &#xff0c;相比于Groo…

Aviator介绍

Aviator简介 Aviator是一个高性能、轻量级的 java 语言实现的表达式求值引擎, 主要用于各种表达式的动态求值。现在已经有很多开源可用的 java 表达式求值引擎,为什么还需要 Avaitor 呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby的笨重, Aviator非常小, 加上…

西电计算机学院名誉院长,杨孟飞院士受聘为西电计科院名誉院长及讲席教授

西电新闻网讯(通讯员 陈龙)12月21日上午&#xff0c;西安电子科技大学计算机科学与技术学院名誉院长杨孟飞院士“华山学者”讲席教授及战略咨询委员会委员聘任仪式在北校区主楼Ⅱ区319会议室举行&#xff0c;校长杨宗凯、副校长王泉参加仪式。仪式由计科院执行院长崔江涛主持。…

北航计算机学院新闻,澳门理工学院代表团访问我校计算机学院

北航新闻网1月21日电(通讯员 盛浩)2019年1月16日&#xff0c;澳门理工学院副院长李雁莲教授、孙毓奇教授等一行三人到北航计算机学院就双方合作等事项进行交流。 座谈会由先进计算机应用技术教育部工程研究中心熊璋教授主持&#xff0c;计算机学院副院长胡春明副教授、中心李超…

【华人学者风采】陈晓峰 西安电子科技大学

【华人学者风采】陈晓峰&#xff0c;西安电子科技大学网络与信息安全学院副院长。研究方向包括公钥密码学、金融密码学、云计算安全、数据安全、区块链技术及应用、人工智能安全。曾获荣誉&#xff1a; 国家万人计划科技创新领军人才&#xff0c;教育部“青年长江学者” &#…

港科资讯 | 倪明选校长等出席江门“双碳”实验室揭牌暨项目签约仪式

12月7日&#xff0c;由香港科技大学&#xff08;广州&#xff09;&#xff08;筹&#xff09;和江门市政府发起共建的江门“双碳”实验室举行了揭牌暨项目签约仪式&#xff0c;江门双碳实验室正式启动成立。香港科技大学&#xff08;广州&#xff09;&#xff08;筹&#xff09…

莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

一、理解 我的理解就是巧妙的暴力&#xff0c;利用双指针以及分块思想&#xff0c;巧妙的移动双指针&#xff0c;时间复杂度可以达到O(NlogN)。 强推博客&#xff1a;写的又好又全。链接 二、套路 1、普通莫队 【1】核心代码 bool cmp(node a,node b){return belong[a.l]…

香港理工大学计算机系石杰明老师组招收全奖博士生、博士后

来源&#xff1a;AI求职 香港理工大学 香港理工大学位于中国香港特别行政区&#xff0c;QS 最新排名世界 66 位。计算机系&#xff08;Department of Computing&#xff09;USNews CS 排名 36&#xff0c;泰晤士 CS 排名 79。 石杰明博士课题组成员包括有 985/211 顶尖高校背景…

【调剂】华侨大学计算机学院计算机视觉与模式识别实验室钟必能课题组研究生招生...

点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复“调剂”是计算机/软件等专业的所有调剂信息集合&#xff0c;会一直更新的。 课题组主页&#xff1a;https://cst.hqu.edu.cn/info/1109/2001.htmLinkedin: https://www.linkedin.com/in/bineng-zhong-71a36674…

莫队算法思想

目录 莫队算法普通莫队方法&#xff1a;主要代码结构&#xff1a;例题&#xff1a;小B的询问例题&#xff1a;小Z的袜子奇偶化排序 带修改的莫队小结&#xff1a; 莫队算法 莫队算法是由前国家队莫涛提出的一种算法&#xff0c;主要应用在一类离线区间查询的问题中&#xff0c…

【华人学者风采】冯佳时 新加坡国立大学

【华人学者风采】冯佳时&#xff0c;新加坡国立大学ECE系助理教授。本科毕业于中国科学技术大学&#xff0c;硕士毕业于中国科学院自动化研究所&#xff0c;博士毕业于新加坡国立大学。研究兴趣包括大污染数据分析&#xff0c;在线和分布式鲁棒性学习及其在对象识别中的应用。 …