Liquor 是一个开源的 Java “动态编译即服务” 的实现框架(零依赖),基于 JDK 编译器构建,可以在运行时编译 Java 字符串代码片段、类、方法等。
功能包 | 大小 | 描述 |
org.noear:liquor | 24kb | 提供 java 动态编译器(支持 jar in jar) |
org.noear:liquor-eval | 18kb | 提供动 java 表达式引擎,java 脚本引擎 |
兼容 java 所有版本的完整语法(支持 java8 到 java24),由运行时版本决定。
本次更新
- 优化 liquor 编译错误提示,显示完整的类路径、行号及错误代码
- 优化 liquor-eval 动态编译类设计,新的执行性能与固定编译类同等性能
- 优化 liquor-evel 改为 LRUCache 缓存
- 添加 liquor DynamicCompiler:compile 方法
- 添加 liquor DynamicClassLoader:getClassBytes 方法
基本特性演示
Java 表达式
Map<String, Object> context = new LinkedHashMap<>();
context.put("a", 1);
context.put("b", 2);
//表达式
System.out.println(Exprs.eval("a + b", context)); //=> 3
Java 脚本(完整的 java 语句、导入、参数、返回申明)
CodeSpec codeSpec = new CodeSpec("return a + b;")
.imports(System.class)
.parameters(
new ParamSpec("a", Integer.class),
new ParamSpec("b", Integer.class)
)
.returnType(Integer.class);
System.out.println(Scripts.eval(codeSpec, 1, 2)); //=>3
Java 动态编译(完整的 java 类代码),调试视频:
https://www.bilibili.com/video/BV198QyYQEmw/
String code = """
public class Execable$3 {
public static int sum(int a, int b) {
return a + b;
}
}
""";
DynamicCompiler compiler = new DynamicCompiler();
compiler.addSource("Execable$3", code);
compiler.build();
Class<?> clazz = compiler.getClassLoader().loadClass("Execable$1");
int sum = (int) clazz.getDeclaredMethod("sum", int.class, int.class)
.invoke(null, 1, 2);
System.out.println(sum);//=>3
代码仓库
- gitee:https://gitee.com/noear/liquor
- github:https://github.com/noear/liquor