我已經創建了加載用戶選擇的java(JPanel)文件的程序。用戶基本上選擇由JavaCompiler編譯並加載下一個生成的類文件的Java文件。 但是,當通過某些文本編輯器在java文件(JPanel)中完成任何更改時,問題即將到來,因爲即使在關閉程序並重新運行項目後,任何新更改都不會反映在類文件中。清除通過java中的class.forName加載的類
我認爲相同的類文件一次又一次地從內存中加載。
有沒有什麼辦法從內存中清除加載的類?
編譯:
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler != null) {
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(diagnostics, null, null);
Iterable<? extends JavaFileObject> fileObjects = stdFileManager.getJavaFileObjectsFromFiles(filesToCompile);
List<String> optionList = new ArrayList<String>();
// set compiler's classpath to be same as the runtime's
rootDir=Utility.createRootDir();
optionList.addAll(Arrays.asList("-d", rootDir.getAbsolutePath(), "-classpath", System.getProperty("java.class.path")));
// optionList.add(()
try {
stdFileManager.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
CompilationTask task = compiler.getTask(null, stdFileManager,null, optionList, null, fileObjects);
Boolean result = task.call();
try {
stdFileManager.flush();
stdFileManager.close();
} catch (IOException e) {
e.printStackTrace();
}
}
加載:
loader = new URLClassLoader(new URL[] { rootDir.toURI().toURL() });
cls = Class.forName(Utility.extractFQDN(sourceFile)+"."+Utility.extractClassName(sourceFile),true, loader);
panel= (JPanel) cls.newInstance();
我已經檢查了編譯後的class文件反編譯器與它更新的代碼,但我不知道爲什麼以前的類文件是按類從內存中加載的裝載機。
檢查task.call()後的結果 - 是否有任何錯誤? –
成功生成類文件沒有錯誤。 – WitVault