【问题标题】:Is it possible to compile a class on the fly in Java without using external libraries?是否可以在不使用外部库的情况下在 Java 中即时编译类?
【发布时间】:2013-09-27 13:44:01
【问题描述】:

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

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

是否有另一种替代机制可以在仅使用 J2SE 的内存编译中执行此操作? BeanShell(我可以做我想做的事的图书馆)在其网页中提到它可能会在“将来的某个时间点”包含在 J2SE 中,但是,其 JSR 的状态是“休眠”(无论如何是什么意思)。

更新:

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

【问题讨论】:

  • 编译类,然后使用自定义类加载器加载它...
  • “无磁盘访问”要求的原因是什么?
  • 你好@Thorbjorn,我需要这个供第三方使用的库。一个原因是我试图最小化我的库的需求(比如用户临时目录的可用性)。
  • 我会说“请在你的类路径中有一个编译器”比“请有一个临时文件夹”更具限制性。

标签: java runtime-compilation


【解决方案1】:

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

【讨论】:

  • 但是我不需要 JDK 来使用 Java Compiler API,对吧?
  • 对,但是 ToolProvider.getSystemJavaCompiler();将返回 null 然后
  • 我明白了,但您认为它可以让我进行所需的内存编译,对吗?您知道我应该考虑的许可问题吗? JDK 可能比 J2SE 更受限制。
  • 1) java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm 2) 我 100% 确定没有许可问题
  • 你需要一些东西来实现 Java Compiler API。如果您不拖入,例如jar 中的 Eclipse 编译器,需要 JDK 提供 javac 中的编译器。
【解决方案2】:

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

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

..然后实例化这样的类?

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

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

从页面..

系统要求

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

* STBC 使用的 API 只是 tools.jar 中编译器的公共接口,仅与 JDK 一起分发(尽管 JDK 的“公共 JRE”似乎也获取tools.jar)。 ..

【讨论】:

  • 我有点困惑,如果安装了JDK,JavaCompiler API 可以独立完成吗? (正如 Evgeniy 所说?)
  • 请让您的答案自成一体。 “请阅读我的宠物项目的整个文档”形式的答案有改进的余地。
  • @ThorbjørnRavnAndersen 在我发表(现已删除)评论后不久,答案被编辑以包含相关部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2016-09-01
  • 2016-04-27
相关资源
最近更新 更多