gpt4 book ai didi

java - 编译 .java 文件并从中执行函数

转载 作者:行者123 更新时间:2023-11-30 03:54:30 27 4
gpt4 key购买 nike

好吧,我有一个程序,用户可以在其中编写 .java 文件并执行它(在运行时......呃!!)。目前,用户只能编辑一个 .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 文件。现在,当我从中执行 main 函数时,它不起作用。事实上,成功的值(value)是真实的(正如它打印的那样)。完成此操作后,用户按下“运行”按钮,我用它来运行该函数:

脚本脚本 = new Script();
脚本.main();

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

现在我不仅需要这个问题的解决方案,而且还需要对正在做什么的解释。请给我一个解释,说明哪里出了问题、为什么会出错以及需要采取哪些措施来修复它。

问候,
拉克什斯

最佳答案

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

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

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

关于java - 编译 .java 文件并从中执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23591150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com