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

问题描述 投票:0回答:5

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

我已经弄清楚了解析阶段和或多或少的Java代码生成阶段。我现在想弄清楚最后一个阶段 - 运行时编译阶段。

遵循此线程:编译为java字节码(不使用Java)我已经意识到以下可能的解决方案:

我希望对这些内容进行比较,以及解决运行时阶段 Java 编译问题的其他建议。

java runtime compilation
5个回答
4
投票

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


2
投票

省去麻烦并使用此处提到的BeanShell执行文本文件中给出的java代码

什么是BeanShell?

BeanShell 是一个小型、免费、可嵌入的 带对象的 Java 源解释器 脚本语言的特点,书面 在爪哇。 BeanShell 动态 执行标准 Java 语法并且 使用通用脚本对其进行扩展 便利性,例如松散类型, 命令和方法闭包,例如 Perl 和 JavaScript 中的那些。

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

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

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


2
投票

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


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


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 remember to create a separate thread for it (not created here).
log.debug("PROCESS Output Stream: " + p.getInputStream());
log.debug("PROCESS Error Stream: " + p.getErrorStream());

p.waitFor(); // Wait till the process is finished

并且可以编译并运行它。

© www.soinside.com 2019 - 2024. All rights reserved.