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