Janino框架介绍
一、简介
Janino是一个超小、超快的开源Java 编译器。Janino不仅可以像javac一样将一组Java源文件编译成一组字节码class文件,还可以在内存中编译Java表达式、代码块、类和.java文件,加载字节码并直接在JVM中执行。
官网地址:http://janino-compiler.github.io/janino/
项目地址:https://github.com/janino-compiler/janino
二、Janino与javac对比
在Java程序运行时编译Java源代码并加载,最基本的方式便是使用javax.tools.ToolProvider.getSystemJavaCompiler()获取系统 Java 编译器(这个编译器通常是 javac)进行编译,笔者认为,相较于javac而言,Janino至少有以下4点优势:
- Janino拥有更快的编译速度
- Janino只依赖JRE,而javac属于JDK
- Janino可以编译Java表达式、代码块及Java源代码,而javac只能编译Java源代码
- Janino可以从ClassLoader中获取编译的源码中依赖的类,而javac需要指定依赖的类所在的jar包位置
对于Janino及javac的编译速度对比,笔者在本机做了简单测试(笔记本i7-1165G7,16G内存,JDK8,固态硬盘),一次性批量编译4000个仅类名不同的Java源代码(260行,24个public方法,直接或间接引用6个jar包中的类)的编译耗时对比见下表。javac可以将源码编译结果存到文件或内存中,即使在与Janino一样将编译结果存到内存中时,javac耗时也为Janino的两倍多。
| 编译器类型 | 编译结果存储位置 | 耗时(s) |
|---|---|---|
| Janino | 内存 | 38 |
| javac | 内存 | 85 |
| javac | 文件系统 | 164 |
三、环境要求
Janino只需要Java 7 JRE或更高版本,不需要JDK。Janino不依赖任何第三方库。 Janino对不同的Java语言版本有不同的限制或局限,详见官网:限制。
四、样例
参见官网:基本样例