【问题标题】:java in-memory compilationjava内存编译
【发布时间】:2008-10-13 22:24:20
【问题描述】:

如何在运行时从字符串生成字节码 (Byte[]),而不使用“javac”进程或类似的东西?有没有像这样调用编译器的简单方法?

稍后添加:

我选择accept the solution that actually best fits my situation。我的应用程序是一个仍处于设计草图阶段的爱好项目,现在是考虑插入新技术的正确时机。此外,由于应该在 BL 方面帮助我的人是 JavaScript 开发人员,因此在这种情况下,使用 JavaScript 解释器而不是存根编译器 + 类加载器的想法似乎对我更有吸引力。这个问题的其他(未被接受的)答案提供了丰富的信息,据我所知,很好地回答了我的问题,所以谢谢,但我会尝试Rhino :)

【问题讨论】:

    标签: java runtime compilation


    【解决方案1】:

    JDK6 有一个Java compiler API。但是,它不一定很容易使用。

    快速谷歌搜索this example usage

    【讨论】:

    【解决方案2】:

    我认为你最好的选择是Janino。这将让您在运行时编译代码并从程序的其余部分调用它。我们在一些系统中使用它来让我们动态更新一些类。

    它不是免费的。它运行良好,但是每次加载新类(或类的版本)时它都会使用 permgen 空间,因此如果您有一个(真正)长时间运行的进程(或加载大量新类的东西),最终您将耗尽内存) 但如果这是一个问题,您可以更改 JVM 中的永久空间量以将障碍移开。

    Janino 实际上是一个编译器,但如果您需要在该级别操作,您可以查看它是如何注入字节码的。您可能最终需要按照 Tom Hawtin 的建议制作类加载器或使用 Java 编译器 API。

    【讨论】:

    • 我在一个项目中使用了 Janino。它有一些限制,但效果很好。据我所知,它是 LPGL...
    • @Mario Ortegón:同意。我们使用了一个稍旧的版本,它不支持任何 Java 1.5 特性,这很痛苦。他们对此进行了改进,尽管仍然缺少一些(例如 for (object : collection) 语法)。
    【解决方案3】:

    您可能会发现 rhino 或 groovy 之类的东西在实践中更有用。

    【讨论】:

    • 虽然你没有从技术上回答我的问题,但你为我打开了一个新的可能性,我认为这将在实践中证明更有用(尽管它需要更多的学习)。谢谢!(+ upvove)
    • 也许我应该更明确一点,我自己也经历了同样的思考过程。我最终使用了 rhino,因为它现在是 JDK 的一部分。祝你好运
    【解决方案4】:

    只要 JDK 中的 tools.jar 文件位于类路径中,您就可以访问编译器。它的文档是here。 API 在某些解释型语言中并不像 eval() 那样简单,但它确实存在。

    您可能还必须进入一些奇怪的 ClassLoader 代码才能实际运行该代码,我对此并不完全确定。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多