java内存编译

java内存编译,java,runtime,compilation,Java,Runtime,Compilation,如何在运行时从字符串生成字节码(Byte[]),而不使用“javac”进程或类似的东西?有没有这样一种调用编译器的简单方法 后来添加: 我选择了。我的应用是一个兴趣项目,仍然是设计素描阶段,现在是考虑插入新技术的合适时机。此外,由于应该帮助我学习BL的人是一名JavaScript开发人员,因此在这种情况下,使用JavaScript解释器而不是存根编译器+类加载器的想法似乎更吸引我。这个问题的其他(未被接受的)答案是信息性的,据我所知,回答我的问题很好,所以谢谢,但我要尝试:)您可能会发现rhin

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

后来添加:


我选择了。我的应用是一个兴趣项目,仍然是设计素描阶段,现在是考虑插入新技术的合适时机。此外,由于应该帮助我学习BL的人是一名JavaScript开发人员,因此在这种情况下,使用JavaScript解释器而不是存根编译器+类加载器的想法似乎更吸引我。这个问题的其他(未被接受的)答案是信息性的,据我所知,回答我的问题很好,所以谢谢,但我要尝试:)

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

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

您可能还需要使用一些奇怪的类加载器代码来实际运行该代码,对此我并不完全确定。然而,它不一定很容易使用


一个快速的谷歌启动了。

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

这不是免费的。它工作得很好,但每次加载一个新类(或类的版本)时都会使用permgen空间,因此如果有一个(真正的)长时间运行的进程(或加载很多新类的东西),最终会耗尽内存,但如果出现问题,可以更改JVM中的permgen空间量,以消除这一障碍


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

我在一个项目中使用了Janino。它有一些局限性,但效果很好。这是我所知道的LPGL…@Mario Ortegón:同意。我们使用了一个稍微旧一点的版本,它不支持任何Java1.5特性,这是一个难题。虽然有些语法(比如for(object:collection)仍然不存在,但他们已经改进了这一点。虽然您在技术上没有回答我的问题,但您为我打开了一个新的可能性,我认为这将在实践中证明更有用(尽管这需要更多的学习)。谢谢你!(+upvove)也许我应该更明确一点,我自己也经历过同样的思考过程。我最终使用了rhino,因为它现在是JDK的一部分。祝链接好运!我发现这个例子对我来说非常有效: