如何在运行时编译和部署java类?

时间:2009-06-30 15:15:39

标签: java runtime compilation

我正在编写一个规则引擎来执行由条件结构确定的简单赋值。规则是XML格式的项目的先决条件。我已经将我的XML模式建模为类似于简单的代码块。我希望解析XML,然后将其转换为Java代码。然后,我希望在运行时编译(并运行)此代码。这样做意味着我的规则引擎不再充当解释器,而是执行本机Java字节代码。

我已经找到了解析阶段,或多或少都是Java代码生成阶段。我现在想弄清楚最后阶段 - 运行阶段的编译。

遵循以下主题:Compile to java bytecode (without using Java)我已经了解了以下可能的解决方案:

我希望能比较这些以及在运行阶段解决Java编译的其他建议。

7 个答案:

答案 0 :(得分:18)

答案 1 :(得分:4)

您可以将其转换为Clojure代码,Clojure编译器会将其转换为字节码。

答案 2 :(得分:4)

这里是java编译实用程序,您可以在运行时编译代码而无需任何字节码工具

http://code.google.com/p/compilation-toolbox/

答案 3 :(得分:2)

Groovy,BeanShell或任何其他基于JVM的脚本语言都具有在运行时注入,修改,添加和运行代码的功能。实际上所有的脚本语言都被解释了,所以实际上那些脚本语言并没有在运行时编译。

答案 4 :(得分:2)

Javassist几乎是一个用Java编写的完整Java编译器,它完全由Java构成。你不能一次给它一个完整的.java文件,但你可以为它提供单个函数的代码字符串,并将它们添加到同一个CtClass对象中,该对象变为字节码,然后是java.lang.Class。

我刚刚发布了GigaLineCompile的0.1版本,它一起使用Javassist(编译器)和Beanshell(解释器),并让您控制优化和何时优化的代码。在更高版本中,它将以更小的粒度在Javassist和Beanshell之间进行更改,因此如果您有许多共享某些子字符串的代码字符串,则会编译子字符串,而其他部分将在beanshell中运行。它主要用于生成Java代码的人工智能,但它也可以替代Clojure或Javassist / Beanshell的极端。

可以在此处下载(带源代码)Javassist,Beanshell和GigaLineCompile: http://sourceforge.net/projects/gigalinecompile

答案 5 :(得分:1)

为自己省去麻烦,并使用此BeanShell提到的Executing java code given in a text file

  

什么是BeanShell?

     

BeanShell是一个小型,免费,可嵌入的   带有对象的Java源解释器   脚本语言功能,写的   在Java中。 BeanShell动态   执行标准的Java语法和   使用通用脚本扩展它   便利,如松散的类型,   命令和方法闭包   Perl和JavaScript中的那些。

     

您可以以交互方式使用BeanShell   用于Java实验和调试   以及扩展您的应用程序   以新的方式。脚本Java借钱   本身就是各种各样的   应用包括快速   原型设计,用户脚本扩展,   规则引擎,配置,测试,   动态部署,嵌入式系统,   甚至是Java教育。

     

BeanShell很小,可以嵌入,所以   你可以从Java调用BeanShell   应用程序来执行Java代码   动态地在运行时或提供   应用程序中的可扩展性。   或者,您可以使用独立   用于操作Java的BeanShell脚本   应用;使用Java   动态的对象和API。以来   BeanShell是用Java编写并运行的   在与您的应用程序相同的VM中,   你可以自由地传递参考   将“实时”对象转换为脚本并返回   他们作为结果。

     

简而言之,BeanShell是动态的   解释Java,加上脚本   语言和灵活的环境   滚成一个干净的包裹。

答案 6 :(得分:1)

你可以像这样分叉一个过程

Process p = Runtime.getRuntime().exec("java -classpath "..." SomeClassContainingMain ...other arguments);       

        //you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here).
        log.debug("PROCESS outputstream : " + p.getInputStream() );
        log.debug("PROCESS errorstream : " + p.getErrorStream());           
    p.waitFor(); // Wait till the process is finished

并且可以编译并运行它。