【问题标题】:Compile and execute java source file in memory在内存中编译并执行java源文件
【发布时间】:2013-04-18 05:22:00
【问题描述】:

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

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

【问题讨论】:

  • 可能不会,但您可以(至少在 Linux 上)在无磁盘文件系统(例如 tmpfs)上创建该文件,这几乎与在内存上工作一样快。也许你可以写自己的ClassLoader
  • “我的应用程序可能没有写权限。” 是因为它被 Java 沙盒化,还是 DYM OS 安全设置?
  • @AndrewThompson 两者。它可能被 Java 沙盒化,因为我的应用程序将从 Internet 下载。由操作系统,因为用户可能决定将 jar 文件(我的应用程序)放在某个目录中,例如 Windows 中的 C:\。
  • “从互联网上下载的。” 所以你的意思是小程序或 JWS 应用程序。? AFAIU,它们是唯一 Java 提供 SecurityManager 的。
  • 对不起,我误读了你的问题。不,它是一个桌面应用程序,因此写入权限仅由操作系统设置引起。

标签: java compilation javac .class-file


【解决方案1】:

为此使用JavaCompiler。我认为诀窍是定义一个自定义JavaFileManager

【讨论】:

    【解决方案2】:

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

    可选地,这个文件管理器可能会考虑兄弟姐妹作为提示 在哪里放置输出。这个提示的确切语义是 未指定。例如,JDK 编译器 javac 将放置类 与原始源文件位于相同目录中的文件,除非 提供类文件输出目录。为了促进这种行为, javac 可能会在以下情况下提供原始源文件作为同级文件 调用这个方法。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多