基本知识
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);
}
}
376

被折叠的 条评论
为什么被折叠?



