Liquor 是一个开源的轻量级 Java 动态编译器(零依赖,40KB),它可以在运行时编译 Java 字符串代码片段、类、方法等。
开源项目地址:
- gitee: https://gitee.com/noear/liquor
- github: https://github.com/noear/liquor
基础编译特性:
- 可以单个类编译
- 可以多个类同时编译
- 可以增量编译
增值功能:
- java 求值表达式引擎
- java 脚本引擎(支持 java8 到 java24 语法)
本次更新
- 使用 getTypeName 替换 getCanonicalName (优化 arm jdk 兼容性)
- 优化 LiquorEvaluator:addSource ';' 号补全处理
- 简化 LiquorEvaluator clazzName 生成,避免冲突可能
- 添加 JavaFileSource 类
特性展示
(1)动态编译展示(编译即服务!)
// A.java
public class A { private B b = new B(); }
// B.java
public class B {}
// Demo.java
public class Demo {
@Test
public void test() throws Exception {
final DynamicCompiler dynamicCompiler = new DynamicCompiler();
dynamicCompiler.addClassPath(new File(".../test/")); //有此设置。动态编译,也可调试
dynamicCompiler.addSource(new JavaFileSource(new File(".../test/A.java")));
dynamicCompiler.build();
final Class<?> clazz = dynamicCompiler.getClassLoader().loadClass("test.A");
System.out.printf("clazz: %s\n", clazz);
}
}
(2)求值表示式展示
System.out.println(Exprs.eval("1+1"));
(3)脚本展示
Scripts.eval("System.out.println(\"hello word\");");
(4)JSR223 规范脚本展示
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("java");
System.out.println(scriptEngine.eval("return 2*6-(6+5);"));