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

时间:2014-05-11 09:52:39

标签: java java-compiler-api

好的,所以我有一个程序,用户可以编写.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函数时,它不起作用。 事实上,成功的价值是真实的(因为它打印成真)。 完成后,用户按下&#34;运行&#34;按钮,我用它来运行该功能:

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

现在由于某种原因,脚本不会自行更新。它仍然执行与修改脚本之前编写的内容相同的内容....虽然文件是按预期编写的,但脚本有某种&#34;更新&#34;仅在下次启动该程序时。 (我没有尝试过这个独立的版本,但它在IDE中更新......这是Netbeans)。

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

的问候,
Rakshith

1 个答案:

答案 0 :(得分:2)

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

你必须为这样的事情创建自己的类加载器,这肯定是一项艰巨的任务,除了javassist之外,我不知道任何库/工具。

一个不错的黑客就是重命名你想要的课程或者包装,但我不确定这是否适合你。