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>
AI 代码解读

基础用法

简单表达式执行示例

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;
    }
}
AI 代码解读
输出结果
Connected to the target VM, address: '127.0.0.1:3797', transport: 'socket'
aB
AI 代码解读

关键代码说明

  • 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);
    }

}
AI 代码解读
注意事项
  • 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

目录
打赏
0
0
0
0
891
分享
相关文章
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
1215 0
Flink 必知必会经典课程8:Flink Connector 详解
关于Flink Connector的详解,本文将通过四部分展开介绍:1. 连接器;2. Source API;3. Sink API;4. Collector的未来发展。
Flink 必知必会经典课程8:Flink Connector 详解
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
本文介绍了阿里云开源大数据团队在实时计算领域的最新成果——向量化流计算引擎Flash。文章主要内容包括:Apache Flink 成为业界流计算标准、Flash 核心技术解读、性能测试数据以及在阿里巴巴集团的落地效果。Flash 是一款完全兼容 Apache Flink 的新一代流计算引擎,通过向量化技术和 C++ 实现,大幅提升了性能和成本效益。
2856 73
实时计算 Flash – 兼容 Flink 的新一代向量化流计算引擎
阿里云Flink-自定义kafka sink partitioner实践及相关踩坑记录
阿里云Flink-自定义kafka sink partitioner实践及相关踩坑记录
1488 1
实时计算 Flink版操作报错合集之在分配所需的最少资源时出现问题,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
[Mvel]Mvel2.0使用指南一 基础
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/75244442 MVEL在很大程度上受到Java语法的启发,作为一个表达式语言,也有一些根本的区别,旨在更高的效率,例如:直接支持集合、数组和字符串匹配等操作以及正则表达式。
15508 0
flink kafka connector源码解读(超详细)
为了掌握Flink自定义Connector,本文直接从源码出发,研究Flink的kafka connector是如何实现的?
1397 0
flink kafka connector源码解读(超详细)
阿里云实时计算企业级状态存储引擎 Gemini 技术解读
本文整理自阿里云 Flink 存储引擎团队李晋忠,兰兆千,梅源关于阿里云实时计算企业级状态存储引擎 Gemini 的研究。
126757 4
阿里云实时计算企业级状态存储引擎 Gemini 技术解读
Flink 异步 I/O 解析
Flink 在内部处理数据是,由于业务的复杂性,不可避免的会与外部系统做数据交互,那么其中的延迟会对流处理的整个工作进度起决定性影响,本文使用几个案例来说明异步I/O的使用方式
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问