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

目录
相关文章
|
4月前
taichi学习记录
关于Taichi编程语言学习的记录,涉及Taichi的安装方法、运行结果截图以及相关学习资源的链接,包括中文语音视频教程、系统学习课程和知乎资料。
|
6月前
|
编解码
《通信原理》期末复习笔记(一)
《通信原理》期末复习笔记(一)
|
6月前
|
编解码 内存技术
《通信原理》期末复习笔记(二)
《通信原理》期末复习笔记(二)
|
8月前
|
SQL 安全 调度
网安预习课程笔记(九到十节)
本文是一篇关于渗透测试案例的分享,案例主要包括弱口令、SQL注入、内网渗透等多个环节,详细描述了渗透测试工作者如何通过一系列步骤获取不同服务器和系统的管理员权限。提到了一些关键的IP地址、数据库和服务器的发现,以及利用这些漏洞如何获取的权限。文章最后讨论了漏洞报告的组成部分,强调了报告的规范性和清晰度对于有效沟通和解决问题的重要性。 请注意,由于原始内容包含多个图片和链接,摘要中并未包含这些元素。
74 11
|
8月前
|
算法 程序员 开发工具
代码随想录 学习记录(1)
代码随想录 学习记录(1)
192 0
|
8月前
|
机器学习/深度学习 供应链 数据挖掘
管理信息系统知识点复习
管理信息系统知识点复习
153 0
|
存储 Ubuntu 算法
KNIME学习记录
KNIME学习记录
799 0
|
前端开发 JavaScript
ReactHooks学习记录
ReactHooks学习记录
|
机器学习/深度学习 人工智能 编译器
C#学习记录
C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本文章用于记录博主学习c#学习经历–学习笔记 文章目录前言一、工具和环境二、结构1.第一个程序2.读入数据三、数据类型四、运算符号五、判断语句六、C# 循环七、C# 数组(Array)总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、工具和环境 Microsoft Visu.
109 0
C#学习记录
|
数据挖掘
书单:分享我的读书笔记和最近阅读的几本好书
人最重要的是三个能力:①学习力-学习总结的能力;②输出力-逻辑思维和沟通表达的能力;③反思力-自省和修正的能力; 阅读、学习,让自己更加快乐,让自己有更多的可能性,让生命的意义有可能延展和突破。
823 2
书单:分享我的读书笔记和最近阅读的几本好书

相关实验场景

更多