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



好的,我有一个程序,用户可以在其中编写.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文件。现在当我从它执行main函数时,它不起作用。事实上,成功的价值是真实的(因为它打印的是真实的)。一旦完成,用户按下"运行"按钮,我用它来运行函数:

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

现在,由于某种原因,脚本不更新自己。它仍然执行修改脚本之前编写的内容....虽然文件是按照预期编写的,但是脚本只有在下次启动程序时才会进行某种"更新"。(我没有尝试过这作为一个独立的,但它在IDE更新…

现在我不仅需要这个问题的解决方案,我还想要一个对正在做的事情的解释。请给我一个解释,什么是错的,为什么是错的,需要做些什么来解决它。


问候,Rakshith

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

你必须创建你自己的类加载器这样的事情工作,这肯定是一个困难的任务,我不知道任何库/工具,除了javassist。

一个很好的方法是重命名你想要的类或包,但我不确定这对你来说是否可以接受。

相关内容

  • 没有找到相关文章

最新更新