是否可以在不使用外部库的情况下在Java中动态编译类?

时间:2013-09-22 16:31:19

标签: java runtime-compilation

在我看来,Java Compiler API允许在运行时编译一个类,将其输出(.class文件)写入文件系统。但是,不支持内存中编译。它是否正确 ?或者是否可以使用此API在内存中编译一个类(来自String)并在之后实例化这样的类?

(我知道我可以将类编译到文件系统并随后使用自定义类加载器加载它,但我想知道我是否可以在内存中编译它而不通过文件系统。)

是否有其他替代机制在内存编译中仅使用J2SE进行此操作? BeanShell(我可以做我想做的库)在其网页中提到它可能在“未来的某个点”包含在J2SE中,但是,JSR的状态是“休眠“(无论它是什么意思)。

更新

理想情况下,我想知道是否可以仅使用J2SE(或者如果有任何预期的J2SE增强功能允许我在例如Java 8中执行此操作)。但是,有关如何确保安装JDK的提示也很受欢迎(感谢Evgeniy)。

2 个答案:

答案 0 :(得分:4)

如果你有JDK就可以了,java编译器只在只有JDK的tools.jar中。见http://docs.oracle.com/javase/7/docs/api/javax/tools/package-summary.html

答案 1 :(得分:1)

  

不支持Java Compiler API ..内存中编译。这是对的吗?

没有。 STBC使用JavaCompiler来做到这一点。

  

..之后实例化这样的课程?

STBC没有尝试加载/运行课程,但我相信它应该是可能的。我想它可能需要一个自定义的“内存”类加载器。

  

..如果安装了JDK,JavaCompiler API可以独立完成吗?

来自页面..

  

系统要求

     

STBC将在任何版本为1.6 + Java Plug-In * JDK(AKA SDK)的计算机上运行。

     

* STBC使用的API只是tools.jar中编译器的公共接口,仅使用JDK 分发(尽管是'公共JRE'的JDK似乎也获得了tools.jar)。 ..