小巧的Java编译器 Janino
所属分类 janino
浏览量 1353
Janino 是一个极小 极快的 开源Java 编译器
Janino is a super-small, super-fast Java compiler)
Janino 不仅可以像 JAVAC 一样将 Java 源码文件编译为字节码文件
还可以编译内存中的 Java 表达式 块 类和源码文件
加载字节码并在 JVM 中直接执行
Janino 同样可以用于静态代码分析和代码操作
项目地址
https://github.com/janino-compiler/janino
官网地址
http://janino-compiler.github.io/janino/
Kettle使用Janino 实现自定义 Java代码组件
flink使用 Janino 生成动态代码
groovy 可实现类似功能
import java.io.StringReader;
import org.codehaus.commons.compiler.IScriptEvaluator;
import org.codehaus.janino.ClassBodyEvaluator;
import org.codehaus.janino.ExpressionEvaluator;
import org.codehaus.janino.Scanner;
import org.codehaus.janino.ScriptEvaluator;
public class JaninoTest {
public static void main(String[] args) throws Exception {
String script="System.out.println(\"Hello world\");";
IScriptEvaluator evaluator = new ScriptEvaluator();
evaluator.cook(script);
evaluator.evaluate(null);
script = "(1+2)*3";
evaluator = new ExpressionEvaluator();
evaluator.cook(script);
Object result = evaluator.evaluate(null);
System.out.println(result + "=" + result+","+result.getClass());
evaluator = new ExpressionEvaluator();
script = "2 * (a + b)";
evaluator.setParameters(new String[] { "a", "b" }, new Class[] { int.class, int.class });
// 表达式返回结果类型
evaluator.setReturnType(int.class);
evaluator.cook(script);
int intresult = (Integer) evaluator.evaluate(new Object[] { 1, 2 });
System.out.println("intresult=" + intresult);
script ="public int bar(int a, int b) { return a + b; }";
Scanner scanner = new Scanner(null, new StringReader(script));
Foo foo = (Foo)ClassBodyEvaluator.createFastClassBodyEvaluator(scanner,Foo.class,null);
System.out.println(foo.bar(2, 3));
}
public interface Foo {
int bar(int a, int b);
}
}
完整代码
https://gitee.com/dyyx/demos/blob/master/janinodemo/src/main/java/dyyx/JaninoTest.java
groovy实战例子
上一篇
下一篇
为何kafka要去掉zookeeper依赖
flink 运行模式 批处理与流处理模式
BigDecimal 使用注意点
Flink 知识点汇总
Flink Watermark 机制
Spark核心设计思想