java内存中编译

时间:2008-10-13 22:24:21

标签: java runtime compilation

如何在运行时从String生成字节码(Byte []),而不使用“javac”进程或类似的东西?是否有一种简单的方法来调用编译器?

以后补充:

我选择accept the solution that actually best fits my situation。我的应用程序是一个仍处于设计草图阶段的业余爱好项目,现在是考虑插入新技术的最佳时机。另外,因为那个应该帮助我的人是一个JavaScript开发人员,在这种情况下,使用JavaScript解释器而不是存根编译器+ classLoader的想法似乎更吸引我。这个问题的其他(未接受的)答案是提供信息的,据我所知,非常好地回答我的问题,所以,谢谢,但我将尝试Rhino:)

4 个答案:

答案 0 :(得分:12)

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

快速谷歌拉起this example usage

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

你可能会发现像rhino或groovy这样的东西在实践中更有用。

答案 3 :(得分:0)

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

您可能还需要使用一些奇怪的ClassLoader代码来实际运行该代码,我对此并不完全确定。