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

目录
相关文章
|
边缘计算 网络协议 网络架构
DoIP看这篇就够了,吐血整理
DoIP看这篇就够了,吐血整理
DoIP看这篇就够了,吐血整理
|
2月前
taichi学习记录
关于Taichi编程语言学习的记录,涉及Taichi的安装方法、运行结果截图以及相关学习资源的链接,包括中文语音视频教程、系统学习课程和知乎资料。
|
存储 Ubuntu 算法
KNIME学习记录
KNIME学习记录
793 0
|
存储 程序员 C++
C++入门详细笔记(共八章)(上)
C++入门详细笔记(共八章)
92 0
C++入门详细笔记(共八章)(上)
|
机器学习/深度学习 人工智能 编译器
C#学习记录
C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本文章用于记录博主学习c#学习经历–学习笔记 文章目录前言一、工具和环境二、结构1.第一个程序2.读入数据三、数据类型四、运算符号五、判断语句六、C# 循环七、C# 数组(Array)总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、工具和环境 Microsoft Visu.
104 0
C#学习记录
|
关系型数据库 MySQL Apache
冬季实战营学习记录三
冬季实战营第三期主要是对mysql数据库的进一步学习,并将实验一学习到的知识做了深一步的提高,看完之后让我对mysql更加熟悉和了解,借此将操作步骤记录下来,以供日后学习参考。
129 0
冬季实战营学习记录三
精心整理python测试小技巧:第十六节
精心整理python测试小技巧:第十六节
精心整理python测试小技巧:第十五节
精心整理python测试小技巧:第十五节
精心整理python测试小技巧:第十四节
精心整理python测试小技巧:第十四节
|
关系型数据库 MySQL PHP
冬季实战营学习记录一
主要记录如何配置apache和php,安装mysql和phpmyadmin
120 0
冬季实战营学习记录一