Janino学习记录

简介: Janino学习记录

Janino官网

Janino是一个轻量级的Java编译器。作为Library,它可以直接在Java程序中调用,动态编译java代码并加载。
编译时可以直接引用JVM中已经加载的类.

支持绝大部分java语法,官方网站上有详细各个版本支持的语法.依据官方的说法简单表达式编译甚至比jdk更快。

官网上的例子及介绍十分详细,有兴趣的同学可以直接查看官网。

增加pom依赖

<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.7</version>
</dependency>

基础用法

简单表达式执行示例

import org.codehaus.janino.*;
public class JaninoDemo {

    public static void main(String[] args) throws InvocationTargetException, CompileException {
        ExpressionEvaluator ee = new ExpressionEvaluator();
        ee.setParameters(new String[]{"param"}, new Class[]{Param.class});
        ee.setExpressionType(String.class);
        ee.cook("param.getA() + param.getB()");
        Param param = new Param();
        param.setA("a");
        param.setB("B");
        String resultStr = (String) ee.evaluate(new Param[]{param});
        System.out.println(resultStr);
    }
}
//参数实体
public class Param{
    private String a;
    private String b;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
}
输出结果
Connected to the target VM, address: '127.0.0.1:3797', transport: 'socket'
aB

关键代码说明

  • ee.setParameters:设置入参类型
  • ee.setExpressionType:设置返回值类型
  • ee.cook:设置需处理的表达式,支持多种格式String/File/InputStream……
  • ee.evaluate:执行表达式并获取结果
参数所对应的JavaBean需具备get/set方法,不支持lombok相关注解。

代码段执行示例:


public class JaninoDemo {

    public static void main(String[] args) throws InvocationTargetException, CompileException {
        scriptEvaluator();
    }

    public static void expressionEvaluator() {
        try {
            ExpressionEvaluator ee = new ExpressionEvaluator();
            ee.setParameters(new String[]{"a", "b"}, new Class[]{int.class, int.class});
            ee.setExpressionType(int.class);
            ee.cook("a + b");
            int result = (Integer) ee.evaluate(new Integer[]{8, 9});
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void scriptEvaluator() throws CompileException, InvocationTargetException {
        ScriptEvaluator se = new ScriptEvaluator();
        se.cook("import static com.meijm.toolbox.janino.JaninoDemo.*;" +
                "expressionEvaluator();");
        se.setDebuggingInformation(true, true, true);
        se.evaluate(null);
    }

}
注意事项
  • cook中的代码块支持常见java语法。
  • se.setDebuggingInformation:设置调试开关,打开后脚本对应的方法支持调试
  • 脚本中调用的静态方法expressionEvaluator() 不能抛出异常,需自己处理异常信息。

参考资料

https://janino-compiler.github.io/janino/

https://github.com/janino-compiler/janino/tree/master/janino/src/test/java/org/codehaus/janino/tests

目录
相关文章
|
SQL 负载均衡 监控
[企业云-实时计算]SLS 全新 Connector 实现来看 Flink Connector 的细节(FLIP-27/FLIP-191)
背景根据之前的企业云的实时计算架构可以知道,我们的选型中,SLS 承担的重要的角色:打通弹外向弹内实时数据回流的链路作为接口 Interface,向工程和算法同学提供宽表和服务,满足业务的自定义需求。但是 SLS 的 connector 怎么说呢,几个字:严重不满足需求。目前网上搜索,大体上有以下几个实现aliyun-log-flink-connector:貌似是SLS 官方团队的实现,只提供了 
1111 0
[企业云-实时计算]SLS 全新 Connector 实现来看 Flink Connector 的细节(FLIP-27/FLIP-191)
|
7月前
|
数据处理 Apache 流计算
Flink Forward Asia 2025 城市巡回 · 上海站
Flink Forward Asia 2025 城市巡回上海站重磅来袭!8月16日,顶尖技术专家齐聚,共探实时计算前沿趋势与行业实践。大会涵盖技术分享、实战案例与开源生态共建,支持线上直播预约。立即报名,共赴技术盛宴!
495 0
Flink Forward Asia 2025 城市巡回 · 上海站
|
Java Go 开发工具
MacOS Java+golang build protoc gRPC 代码生成
MACOS Java+golang GRPC 代码生成 下载protobuf git clone https://github.com/protocolbuffers/protobuf.git git checkout 3.
4534 0
|
7月前
|
存储 弹性计算 监控
阿里云顶会论文 OSDI'25 VIO 弹性直通
本文介绍阿里云团队发表于OSDI顶会的论文《To PRI or Not To PRI, That’s the question》,探讨云计算中虚拟化设备内存管理难题。论文提出纯软件方案VIO,通过内存预检、智能模式切换和自适应锁页设计,实现无需硬件支持的高效内存管理。该方案已在阿里云大规模部署,显著提升资源利用率,兼顾性能与兼容性。
358 0
阿里云顶会论文 OSDI'25 VIO 弹性直通
|
消息中间件 Kafka
消费kafka不需要设置 压缩协议吗 假如生产者压缩协议是lz4
消费kafka不需要设置 压缩协议吗 假如生产者压缩协议是lz4
|
SQL API Apache
官宣|Apache Flink 1.20 发布公告
Apache Flink 1.20.0 已发布,这是迈向 Flink 2.0 的最后一个小版本,后者预计年底发布。此版本包含多项改进和新功能,涉及 13 个 FLIPs 和 300 多个问题解决。亮点包括引入物化表简化 ETL 管道开发,统一检查点文件合并机制减轻文件系统压力,以及 SQL 语法增强如支持 `DISTRIBUTED BY` 语句。此外,还进行了大量的配置项清理工作,为 Flink 2.0 铺平道路。这一版本得益于 142 位贡献者的共同努力,其中包括来自中国多家知名企业的开发者。
2330 7
官宣|Apache Flink 1.20 发布公告
|
存储 网络协议 Java
【JDK21】详解虚拟线程
【JDK21】详解虚拟线程
1036 0
|
NoSQL Java Go
双亲委派模型与 Flink 的类加载策略
Flink 作为基于 JVM 的框架,在 flink-conf.yaml 中提供了控制类加载策略的参数 classloader.resolve-order,可选项有 child-first(默认)和 parent-first。本文来简单分析一下这个参数背后的含义。
双亲委派模型与 Flink 的类加载策略
|
网络安全 Python
pycharm连接云服务器#潞晨cloud
Luchencloud采用SSH密钥对连接,需先在本地生成公钥并添加到平台
435 0