如何在运行时从String生成字节码(Byte []),而不使用“javac”进程或类似的东西?是否有一种简单的方法来调用编译器?
以后补充:
我选择accept the solution that actually best fits my situation。我的应用程序是一个仍处于设计草图阶段的业余爱好项目,现在是考虑插入新技术的最佳时机。另外,因为那个应该帮助我的人是一个JavaScript开发人员,在这种情况下,使用JavaScript解释器而不是存根编译器+ classLoader的想法似乎更吸引我。这个问题的其他(未接受的)答案是提供信息的,据我所知,非常好地回答我的问题,所以,谢谢,但我将尝试Rhino:)
答案 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代码来实际运行该代码,我对此并不完全确定。