假设我有String
包含.java
文件的内容。是否有任何API允许我将此源文件编译为虚拟.class
文件(即生成并将内容存储在内存中,而不是在磁盘上创建实际的物理.class
文件)?然后这个“虚拟”.class
将在JVM中加载并执行?
编辑1:我想要这样做的唯一原因是因为有时,我的应用程序可能没有写入权限。
答案 0 :(得分:1)
使用JavaCompiler
进行此操作。我认为诀窍是定义自定义JavaFileManager
。
答案 1 :(得分:1)
Java确实有compilation API动态编译文件,但我不知道一个不会将类文件保存到磁盘的选项。您始终可以使用ClassLoader
并动态加载这些类,然后使用它们。您可以通过覆盖getFileForOutput方法在内存中加载类。
或者,此文件管理器可能会将兄弟姐妹视为提示 放置输出的位置。这个提示的确切语义是 不确定的。例如,JDK编译器javac将放置类 文件与原始源文件在同一目录中,除非a 提供了类文件输出目录。为了促进这种行为, javac可能会将原始源文件作为兄弟提供 调用这种方法。
另一个选择是使用像BeanShell这样的解释器来运行java代码。它执行类似脚本的脚本,可以在repl模式下工作。