10

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

后期补充:

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

4

4 回答 4

12

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

一个快速的谷歌提取了这个示例用法

于 2008-10-13T22:45:51.907 回答
6

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

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

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

于 2008-10-13T23:02:50.080 回答
4

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

于 2008-10-13T22:27:04.580 回答
0

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

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

于 2008-10-13T22:44:35.513 回答