基本知识
Liquor Java 脚本,基于 Java 动态编译功能构建。支持完整的 Java 语法,及各语言版本新特性。脚本代码,可分为两部分:
- 脚本头(用于导入类)
- 脚本主体(主体逻辑代码。也可以有内部类、接口、或记录)
Helloworld:
Scripts.eval("System.out.println(\"hello world\");");
依赖包(40KB左右):
<dependency><groupId>org.noear</groupId><artifactId>liquor-eval</artifactId> <version>1.3.1</version>
</dependency>
好处:不需要学习新的语言和语法
- (1) 支持 Java8,泛型与Lambda表达式等特性
public class TestApp {public static void main(String[] args) throws Exception {Scripts.eval("""import java.util.ArrayList;import java.util.List;//泛型List<String> list = new ArrayList<>();list.add("c");list.add("java");//Lamda 表达式list.stream().forEach(System.out::println);""");}
}
- (2) 支持 Java11,var 等特性
public class TestApp {public static void main(String[] args) throws Exception {Scripts.eval("""import java.util.ArrayList;//泛型var list = new ArrayList<String>();list.add("c");list.add("java");//表达式list.stream().forEach(System.out::println);""");}
}
- (3) 支持 Java17,record 等特性
public class TestApp {public static void main(String[] args) throws Exception {Scripts.eval("""record Point(int x, int y) {}; //定义内部类、或接口、或记录Point origin = new Point(12, 34);System.out.println(origin);""");}
}
- (4) 支持 Java21,switch 模式匹配等特性
public class TestApp {public static void main(String[] args) throws Exception {CodeSpec codeSpec = new CodeSpec("""return switch (obj) {case null -> "null";case String s -> "String=" + s;case Number i -> "num=" + i;default -> "未知对象";};""").parameters(new ParamSpec("obj", Object.class)) //申明参数.returnType(Object.class); //申明返回类型Scripts.eval(codeSpec, "1");Scripts.eval(codeSpec, 1);}
}
好处:调试方便
因为是 100% 的 Java 语法。所以我们可以使用 Java 开发工具进行调试。
- 我们把“脚本头”放到一个类的头部
- 把“脚本主体”放到一个静态函数里。
这样,就可以调试了。比如,把上面的 (1) 示例转面调试形态就是:
//#脚本头#
import java.util.ArrayList;
import java.util.List;public class TestApp {public static void main(String[] args) throws Exception {//#脚本主体#List<String> list = new ArrayList<>();list.add("c");list.add("java");list.stream().forEach(System.out::println);}
}