Java 动态编译工具 Janino 和 Liquor 差别
如果你只要 Java7 及以下的语法支持,建议 Janino。如果要你想更全的 Java8、Java11、Java17、Java21 等语法,可以选 Liquor。
1、它们相同的地方
- 提供的相似的能力接口
接口 | Janino | Liquor |
---|---|---|
动态编译器 | SimpleCompiler | DynamicCompiler |
表达式评估器 | ExpressionEvaluator | LiquorEvaluator (Exprs) |
脚本评估器 | ScriptEvaluator | LiquorEvaluator (Scripts) |
- 都是 Java 语言(语法)的动态应用。生成的字节码都可以完全访问 JRE,可能要注意安全的控制。
2、细节区别处
- Janino 基于自已的编译能力实现。
- 支持 Java7 及以下语法。
- 单次编译性能,更好。
- 支持命令行编译。
- 提供更丰富的功能。比如代码分析器,等。
- Liquor 基于 JDK 自带的编译能力实现。
- 支持 Java8、Java11、Java17、Java21 等语法(由运行时版本决定)。
- 单次编译性能,差些。
- 不支持命令行编译。可用 javac 命令。
3、具体差异 - 动态编译器
动态编译器的性能,基本上可以按“次”计量。次数越多,费时越多。尽量把可知代码,合在一起编译(次数,越少越好)。
- Janino
public class JaninoTest {
public static void main(String[] args) throws Exception {
//此类,不可以复用(可以通过别的方式,实现多类一起编译)
SimpleCompiler compiler = new SimpleCompiler();
String className = "HelloWorld";
String classCode = "public class HelloWorld { " +
" public static void helloWorld() { " +
" System.out.println(\"Hello, world!\"); " +
" } " +
"}";
//只能单个编译
compiler.cook(classCode);
//再 cook ,则会异常
Class<?> clazz = compiler.getClassLoader().loadClass(className);
clazz.getMethod("helloWorld").invoke(null);
}
}
- Liquor
public class LiquorTest {
public static void main(String[] args) throws Exception{
//可以复用(可以,不断的增量编译)
DynamicCompiler compiler = new DynamicCompiler();
String className = "HelloWorld";
String classCode = "public class HelloWorld { " +
" public static void helloWorld() { " +
" System.out.println(\"Hello, world!\"); " +
" } " +
"}";
//可添加多个源码
compiler.addSource(className, classCode);
compiler.build();
//构建后,仍可添加不同类的源码再构建
Class<?> clazz = compiler.getClassLoader().loadClass(className);
clazz.getMethod("helloWorld").invoke(null);
}
}
4、具体差异 - 表达式评估器
比较 | Janino | Liquor |
---|---|---|
缓存 | 无(可以自己包装) | 有二级缓存(类加载器缓存,编译结果缓存) |
体验 | 每次要重新构建 | 方便 |
性能 | 单次更好 | 缓存命名时,非常好(接近原始 Java 代码性能) |
- Janino
public class JaninoTest {
public static void main(String[] args) throws Exception {
//每次要新实例化
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.cook("3 + 4");
System.out.println(ee.evaluate());
}
}
- Liquor
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
System.out.println(Exprs.eval("3 + 4"));
}
}
5、具体差异 - 脚本评估器
比较 | Janino | Liquor |
---|---|---|
缓存 | 无(可以自己包装) | 有二级缓存(类加载器缓存,编译结果缓存) |
体验 | 每次要重新构建 | 方便 |
性能 | 单次更好 | 缓存命名时,非常好(接近原始 Java 代码性能) |
- Janino
public class JaninoTest {
public static void main(String[] args) throws Exception {
//每次要新实例化
ScriptEvaluator se = new ScriptEvaluator();
se.cook("System.out.println(\"hello word\");");
se.evaluate();
}
}
- Liquor
public class LiquorTest {
public static void main(String[] args) throws Exception {
//单例,可复用,线程安全
Scripts.eval("System.out.println(\"hello word\");");
}
}
Java 动态编译工具 Janino 和 Liquor 差别的更多相关文章
- java动态编译笔记
1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...
- Java 动态编译组件 & 类动态加载
1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...
- java动态编译 (java在线执行代码后端实现原理)(二)
在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...
- java动态编译 (java在线执行代码后端实现原理)
需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...
- Java动态编译技术原理
这里介绍Java动态编译技术原理! 编译,一般来说就是将源代码转换成机器码的过程,比如在C语言中中,将C语言源代码编译成a.out,,但是在Java中的理解可能有点不同,编译指的是将java 源代码转 ...
- java反编译工具JD-GUI
这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar
- 7 款开源 Java 反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- java反编译工具
由于JAVA语言安全性高.代码优化.跨平台等特性,从1995年5月由SUN公司发布后,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位. 不过,JAVA最突出的跨平台优势使得它 ...
- java反编译工具(XJad)
java反编译工具(XJad) 2.2 绿色版 http://www.cr173.com/soft/35032.html Demo.class ---> Demo.java
- 7款开源Java反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
随机推荐
- 前端说你的API接口太慢了,怎么办?
当有千万条海量数据时,前端调取接口发现接口响应的太慢,前端这时让你优化一下接口,你说有几千万条数据,觉得自己尽力了,前端觉得你好菜,别急,读完这篇文章,让前端喊你一声:大佬,厉害!!! 常用的方法总结 ...
- 后端说,单页面SPA和前端路由是怎么回事
没有请求的路由 在传统开发中,浏览器点击一个超链接,就会像后端web服务器发送一个html文档请求,然后页面刷新.但开始单页面开发后,就完全不同了. 单页面?这个概念难以理解.我用一个js作为整个we ...
- golang轻量级的代码复制粘贴检查器 cpd
golang轻量级的代码复制粘贴检查器 cpd 项目地址: https://github.com/dengjiawen8955/copy-paste-detector 快速开始 clone git c ...
- ELK多租户方案
一.前言 日志分析是目前重要的系统调试和问题排查的重要手段之一,而目前分布式系统由于实例和机器众多,所以构建一套统一日志系统是非常必要的:ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用 ...
- 买卖股票相关算法-动态规划-python
要求1: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票.设计 ...
- BI 工具如何助力市政设计公司实现数字化转型?
一.前言 近年来,国家出台多个政策文件来鼓励和发展数字化和智能化,如<十四五规划>提出要推进产业数字化转型.<交通强国建设纲要>提出要大力发展智慧交通.上海市发布的<关于 ...
- RPC和 HTTP协议
RPC 和HTTP 的区别 服务发现 HTTP,知道服务域名,可以通过 DNS 解析 得到 服务的IP地址,从而进行访问 RPC 需要一个专门的中间服务去保存服务名和IP信息(注册中心,nacos.c ...
- 2、SpringBoot2之入门案例
2.1.创建Maven工程 2.1.1.创建空项目 2.1.2.设置项目名称和路径 2.1.3.设置项目sdk 2.1.4.项目初始状态 注意:需要关闭项目再重新打开,才能看到SpringBoot-P ...
- 【MySQL】JSON相关
一些概念 MySQL里的json分为json array和json object. $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object, ...
- 【OracleDB】 07 分组查询 & 分组函数
分组函数 分组函数作用于一组数据,并对一组数据返回一个值. Oracle中分组函数的种类: - 求平均值 AVG - 计数记录数 COUNT - 求最大值 MAX - 求最小值 MIN - 求和 SU ...