1

好的,所以我有一个程序,用户可以在其中编写 .java 文件并执行它(在运行时....duh !!)。目前,用户只能编辑一个 .java 文件(暂时)。现在我想编译 .java 文件并将其制成 .class 文件。要运行该文件,我希望用户有一个void main()函数,我只需执行该函数即可运行它。因此,我使用 JTextArea、BufferedReader、BufferedWriter 等使 .java 文件可编辑。现在我编写的用于编译文件的代码是:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null)) {
    Iterable<? extends JavaFileObject> compilationUnits = filemanager.getJavaFileObjectsFromStrings(Arrays.asList("src/User/Script.java"));
    JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
    boolean success = task.call();
    System.out.println(success);
} catch(IOException e){
    System.out.println("IOException");
}

该代码将文件编译为 .class 文件。现在,当我从中执行主要功能时,它不起作用。事实上,成功的价值是真实的(因为它打印的是真实的)。完成后,用户按下“运行”按钮,我使用它来运行该功能:

Script script = new Script(); script.main();

现在由于某种原因,脚本不会自行更新。它仍然执行在修改脚本之前编写的相同内容....尽管文件按预期写入,但脚本仅在下次启动程序时才会进行某种“更新”。(我没有单独尝试过,但它在 IDE 中更新......这是 Netbeans)。

现在我不仅需要解决这个问题,而且还想解释正在做什么。请给我一个解释,说明什么是错的,为什么是错的以及需要做些什么来解决它。

问候,
拉克什

4

1 回答 1

2

这里的问题是该类已经加载到 JVM。您必须卸载该类并重新加载新版本。如果在启动应用程序之前该类不存在,它应该可以工作。

您必须创建自己的类加载器才能使这样的事情起作用,这肯定是一项艰巨的任务,除了javassist之外,我不知道有任何库/工具可以做到这一点。

一个不错的技巧是重命名您想要的类或包,但我不确定这是否适合您。

于 2014-05-11T10:12:36.100 回答