java运行来自另一个程序问题的编译类文件

java运行来自另一个程序问题的编译类文件,java,class,javac,Java,Class,Javac,在我的程序中,我试图编译和运行一些java代码,当我点击一个按钮时,我从一个文本字段中得到这些代码。要编译代码,我使用: JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector(); StandardJavaFileManager fileManager = compiler.getStandardFileMa

在我的程序中,我试图编译和运行一些java代码,当我点击一个按钮时,我从一个文本字段中得到这些代码。要编译代码,我使用:


JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector diagnostics = new DiagnosticCollector();

StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable compilationUnits = fileManager.getJavaFileObjectsFromStrings(Arrays.asList("Code.java"));
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
boolean succ = task.call(); 
然后我调用我的code.class的main方法

code.main(新字符串[0])


第一次通过单击按钮编译并运行代码时,它工作正常,但当我在TextField中更改代码并再次编译并运行时,它不会更新,但会运行旧代码

您似乎在与调用程序相同的JVM中运行编译后的程序(
code
)?如果是这样,请记住,一旦JVM加载了一个类,该类就应该保留。您需要应用一些类加载器魔法,以便能够“忘记”以前的版本,并在重新编译后加载新版本

这里的“魔法”可以简单到:

  • 显式创建自己的类加载器
  • 将新编译的类加载到该类加载器中
  • 重新编译时,放弃上一个类装入器,然后重新开始
注1:您没有显示调用
main
的确切顺序,但显然需要使用反射来调用编译应用程序时不存在的代码

注2:根据惯例,
code
将是变量的名称。如果这应该是一个类的名称,那么使用类的拼写/大小写会更清楚:
code

我使用了一个例子来重新加载我的类:
URL[]URL=null;File dir=新文件(System.getProperty(“user.dir”)+File.separator+“dir”+File.separator);URL=dir.toURI().toURL();URL=新URL[]{URL};ClassLoader cl=新的URLClassLoader(URL);类别cls=cl.loadClass(“代码”);代码myObj=(代码)cls.newInstance();myObj.main(新字符串[0])但它仍然不起作用,