# liquor **Repository Path**: z4zr/liquor ## Basic Information - **Project Name**: liquor - **Description**: Java 动态编译、表达式、脚本工具(兼容 jar in jar) - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 66 - **Created**: 2024-09-20 - **Last Updated**: 2024-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

Liquor for java

Java 动态编译、表达式、脚本工具(兼容 jar in jar)

Maven Apache 2 jdk-8 jdk-11 jdk-17 jdk-21 jdk-22
gitee star github star



本工具的编译器代码主要源自 arthas。相关的知识点比较冷门,甚是珍贵。为了复用方便,特整理成一个小工具包进行长期维护。后来又增加了表达式、脚本支持。 | 工件 | 大小 | 功能 | 功能描述 | |----------------|------|--------------------------------------|----------------------------------| | liquor | 24KB | DynamicCompiler | 编译一个或多个类(可相互依赖,可多次不重复编译) | | liquor-eval | 12KB | ExpressionEvaluator
ScriptEvaluator | 评估一行表达式(可多次评估)
评估一块脚本(可多次评估) | 引用依赖: ```xml org.noear liquor-eval 1.2.7-SNAPSHOT ``` 示例参考: * [liquor_demo_solon](liquor_demo_solon) * [liquor_demo_springboot](liquor_demo_springboot) ## 编译器演示 可以有包名;可以导入类;跟平常写 java 类一样。 ```java public class DemoApp { public static void main(String[] args) throws Exception{ //可以复用(不要,不断的新建) DynamicCompiler compiler = new DynamicCompiler(); String className = "HelloWorld"; String classCode = "import java.util.HashMap;\n\n"+ "public class HelloWorld { " + " public static void helloWorld() { " + " System.out.println(\"Hello, world!\"); " + " } " + "}"; //添加源码(可多个)并 构建 compiler.addSource(className, classCode).build(); Class clazz = compiler.getClassLoader().loadClass(className); clazz.getMethod("helloWorld").invoke(null); } } ``` ## 评估器演示 * 表达式评估器(只能写一行代码)//内部会把表达式编译为一个静态函数 ```java public class DemoApp { public static void main(String[] args) throws Exception { //可以复用(不要,不断的新建) ExpressionEvaluator evaluator = new ExpressionEvaluator(); //基础 System.out.println(evaluator.eval("1+1")); //进阶 CodeSpec code1 = new CodeSpec("$0 + 22").parameters(Integer.class); System.out.println(evaluator.eval(code1, 1)); //=> 23 CodeSpec code2 = new CodeSpec("aa + 22").parameters(new String[]{"aa"}, new Class[]{Integer.class}); System.out.println(evaluator.eval(code2, 2)); //=> 24 Map bindings3 = new HashMap<>(); bindings3.put("bb", 3); System.out.println(evaluator.eval("bb + 22", bindings3)); //=>25 } } ``` * 脚本评估器 //内部会把脚本编译为一个静态函数 可以导入类;不能有包名; ```java public class DemoApp { public static void main(String[] args) throws Exception { //可以复用(不要,不断的新建) ScriptEvaluator evaluator = new ScriptEvaluator(); //基础 evaluator.eval("System.out.println(\"hello word\");"); //进阶(如果有内部类,不要加 public) CodeSpec code1 = new CodeSpec("import java.util.HashMap;\n\n"+ " class Demo {\n" + " public String hello(String word) {\n" + " return word;\n" + " }\n" + " }\n" + "\n" + " Demo demo = new Demo();\n" + " return demo.hello(name);") //name 为外部参数 .parameters(new String[]{"name"}, new Class[]{String.class}) .returnType(String.class); System.out.println(evaluator.eval(code1, "noear")); //=>noear } } ```