java内存中编译

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

后来补充:

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

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

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

一个快速谷歌拉起这个示例用法 。

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

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

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

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

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