如果你只要 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 差别的更多相关文章

  1. java动态编译笔记

    1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...

  2. Java 动态编译组件 & 类动态加载

    1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...

  3. java动态编译 (java在线执行代码后端实现原理)(二)

    在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...

  4. java动态编译 (java在线执行代码后端实现原理)

    需求:要实现一个web网页中输入java代码,然后能知道编译结果以及执行结果 类似于菜鸟java在线工具的效果:https://c.runoob.com/compile/10 刚开始从什么概念都没有到 ...

  5. Java动态编译技术原理

    这里介绍Java动态编译技术原理! 编译,一般来说就是将源代码转换成机器码的过程,比如在C语言中中,将C语言源代码编译成a.out,,但是在Java中的理解可能有点不同,编译指的是将java 源代码转 ...

  6. java反编译工具JD-GUI

    这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar

  7. 7 款开源 Java 反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...

  8. java反编译工具

    由于JAVA语言安全性高.代码优化.跨平台等特性,从1995年5月由SUN公司发布后,迅速取代了很多传统高级语言,占据了企业级网络应用开发等诸多领域的霸主地位. 不过,JAVA最突出的跨平台优势使得它 ...

  9. java反编译工具(XJad)

    java反编译工具(XJad) 2.2 绿色版 http://www.cr173.com/soft/35032.html Demo.class     --->    Demo.java

  10. 7款开源Java反编译工具

    今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...

随机推荐

  1. spring boot 快速入门(一)创建一个简单的Spring Boot项目

    1.什么是Spring Boot Spring Boot makes it easy to create stand-alone, production-grade Spring based Appl ...

  2. 释放资源的方式try-with-resources

    1.try-catch-finally 2.try-with-resources 使用方法 try(//这里定义你要使用的资源){} catch(){} 注意:try()里只能存放流对象(资源对象), ...

  3. keycloak~为微信二维码添加动态kc认可的动态state

    本实例将通过keycloak社区登录实现微信二维码的登录,并且二微码不是keycloak动态生成,而是通过微信提供的js生成的,在页面上直接输出的方式实现的. 动态state 在Keycloak中使用 ...

  4. 映射lun

    环境 VMware1 网卡与 主机ping通 创建文件夹将文件解压进去 删除压缩包 创建虚拟机 下一步下一步,完成虚拟机 编辑虚拟机设置 否 账号密码 admin Admin@storage 等待 导 ...

  5. 认识netty的基本组件

    Java NIO VS Netty 有了 Java NIO,而且 Netty 也是基于 Java NIO 实现,那么为什么不能直接用 Java NIO 来实现网络通信模块呢? 接下来我就给大家解释一下 ...

  6. CentOS-7离线安装perl

    1.下载相关安装包 CentOS-7 所有rpm包的仓库地址:https://vault.centos.org/7.9.2009/os/x86_64/Packages/ perl-5.16.3-297 ...

  7. 【Spring Data JPA】07 Specifications动态查询

    [前言说明] 针对CRUD种的查询,因为我们的查询总是具有各种各样的筛选条件 为了我们的程序能够更加适应筛选条件的变化,SpringDataJpa提供了Specifications这种解决方案 Spe ...

  8. docker容器下安装nccl失败,报错:Failed to init nccl communicator for group,init nccl communicator for group nccl_world_group

    相关内容参考: https://www.cnblogs.com/devilmaycry812839668/p/15022320.html =============================== ...

  9. 使用UltraISO克隆clone树莓派SD卡(注意不是复制、备份,是克隆)

    搞了好长时间做了一个树莓派的SD卡,包括了一些自己安装的配置,为了防止哪天把这个SD卡搞坏掉(比如写数据时候断电,比如apt upgrade时掉电),于是考虑把这个SD卡进行克隆clone. 因为手上 ...

  10. MD5签名生成,字典排序,实际生产

    1.背景 作用:防止请求参数篡改,限制请求时效性: 常用方式:md5签名 关键:签名Key 常用签名原串排列:字母顺序.key1=value1&key2=value2....key (注意:签 ...