Janino是一个超级小但又超级快的Java™ 编译器. 它不仅能像javac工具那样讲一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,并把编译后的字节码直接加载到同一个JVM中运行. Janino不是一个开发工具, 而是作为运行时的嵌入式编译器,比如作为表达式求值的翻译器或类似于JSP的服务端页面引擎
JANINO被整合到Apache Commons JCL项目和JBoss Rules/Drools项目
JANINO可以被用于静态代码分析或者对代码进行修改
JANINO可以被配置成使用javax.tools.JavaCompiler的接口(只在JDK1.6中可用)
特性: Janino的主要设计目标是保持编译器体积小和功能简单, 同时提供几乎和javac 1.4兼容的编译器. 我(作者)不喜欢为了一个简单的应用程序夹带大量的类库
Janino实现了如下Java语言中的要素: 包声明、类导入声明、类定义声明、接口定义声明 继承,包括使用extends和implements关键字 静态成员类型声明
内部类,包括成员内部类,匿名内部类,局部内部类 类初始化,实例初始化 属性和方法声明 局部变量声明 类变量,实例变量的初始化 代码块语句 if .. else语句 for循环,while循环、do … while循环 try … catch … finally语句 throw语句、 return语句、break语句、continue语句、switch关键字、synchronized关键字 8种基本数据类型(boolean, char, byte, short,int,long,float,double) 赋值符号(=,+=,-=,=,/=,&=,|=,^=,%=,<<=,>>=,>>>=) 三目条件运算符(… ? … : … ) 逻辑运算符(&& || & | !) 位运算符 (& | ^ >> << >>>) 数值运算符( / % + - ) 字符串连接运算符(+) 圆括号表达式 属性读写(例如 System.out) 父类成员属性的读写和父类成员函数的调用(super.meth(); super.field = x;)
例子:
// Compile the expression once; relatively slow. ExpressionEvaluator ee = new ExpressionEvaluator( "c > d ? c : d", // expression int.class, // expressionType new String[] { "c", "d" }, // parameterNames new Class[] { int.class, int.class } // parameterTypes ); // Evaluate it with varying parameter values; very fast. Integer res = (Integer) ee.evaluate( new Object[] { // parameterValues new Integer(10), new Integer(11), } ); System.out.println("res = " + res);