首页  

小巧的Java编译器 Janino     所属分类 janino 浏览量 1174
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核心设计思想