在内存中编译并执行java源文件

时间:2013-04-18 05:22:01

标签: java compilation javac .class-file

假设我有String包含.java文件的内容。是否有任何API允许我将此源文件编译为虚拟.class文件(即生成并将内容存储在内存中,而不是在磁盘上创建实际的物理.class文件)?然后这个“虚拟”.class将在JVM中加载并执行?

编辑1:我想要这样做的唯一原因是因为有时,我的应用程序可能没有写入权限。

2 个答案:

答案 0 :(得分:1)

使用JavaCompiler进行此操作。我认为诀窍是定义自定义JavaFileManager

答案 1 :(得分:1)

Java确实有compilation API动态编译文件,但我不知道一个不会将类文件保存到磁盘的选项。您始终可以使用ClassLoader并动态加载这些类,然后使用它们。您可以通过覆盖getFileForOutput方法在内存中加载类。

  

或者,此文件管理器可能会将兄弟姐妹视为提示   放置输出的位置。这个提示的确切语义是   不确定的。例如,JDK编译器javac将放置类   文件与原始源文件在同一目录中,除非a   提供了类文件输出目录。为了促进这种行为,   javac可能会将原始源文件作为兄弟提供   调用这种方法。

另一个选择是使用像BeanShell这样的解释器来运行java代码。它执行类似脚本的脚本,可以在repl模式下工作。