用 Liquor Java 脚本引擎有什么好处?(相对于 Groovy 和 JavaScript )

基本知识

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值