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这样的运行在 ...
随机推荐
- 【VMware VCF】VMware Cloud Foundation Part 01:概述。
VMware Cloud Foundation(简称 VCF)是 VMware 打造的一套用于 Software Defined Data Center(SDDC)软件定义数据中心的全栈云平台解决方案 ...
- vue进阶一~数据响应式,数据响应到视图层,手写v-model,订阅发布者模式,
1,数据响应式 当数据发生改变的时候,我们立即知道数据发生改变,并做出相关的操作:发送请求,打印文字,操作DOM等. 1.1,vue实现数据响应的原理 vue中使用了两种模式来实现数据响应式,分别是v ...
- java srpint boot 2.2.1 第二部份,乐观锁机制, 构造复杂查询条件,分页查询 相关内容,删除与软删除
第二部份,引起锁机制的原理和解决方案: 测试环境搭建第一步先建一个数据库表用于模拟商品购买. CREATE TABLE product ( id INT AUTO_INCREMENT PRIMARY ...
- Gradle的安装和创建java项目(idea)
安装 Gradle下载地址:http://services.gradle.org/distributions/ 下载后解压. 解压后的目录结结构如下: 新增环境变量 在path环境变量中添加以下内容: ...
- Ubuntu系统中CUDA套件nvvp启动后报错Failed to load module "canberra-gtk-module"
最近在看cuda方面的内容,需要对cuda代码做一些性能分析,于是需要使用nvvp,但是启动nvvp后报错:Failed to load module "canberra-gtk-modul ...
- 粉丝提问|c语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数
问题描述: 某个函数fun_1()是在lib内,没法修改的,在程序中大量的使用了该函数,现在想把原本fun_1失效(现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(), ...
- Ubuntu 16.04 部署Mariadb
默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们要设置MariaDB仓库. sudo apt-get install software-properties-common ...
- 细说WebService
细说WebService 简介 WebService 是一个应用于客户端.服务端,基于http协议的web应用程序,他有一个非常重要的特点,那就是可以跨语言.跨平台进行远程调用,可应用于分布式系统中的 ...
- QTreeWidget绑定QTabWidget
QTreeWidget绑定QTabWidget 本文仅供本人知识总结使用,所以内容会比较浅显,不喜勿喷. 文章目录 QTreeWidget绑定QTabWidget 一.通过treeWidget路径配合 ...
- 使用C#爬取快手作者主页,并下载视频/图集
最近发现一些快手的作者,作品还不错,出于学习研究的目的,决定看一下怎么爬取数据.现在网上有一些爬虫工具,不过大部分都失效了,或者不开源.于是自己就写了一个小工具.先看一下成果: 软件只需要填写作者ui ...