ユーザーが選択したJava(JPanel)ファイルをロードするプログラムを作成しました。ユーザーは基本的に、JavaCompilerによってコンパイルされ、次に生成されたクラスファイルがロードされるJavaファイルを選択します。しかし、何らかのテキスト エディタを使用して Java ファイル (JPanel) に変更を加えると、プログラムを閉じてプロジェクトを再実行しても、新しい変更がクラス ファイルに反映されないため、問題が発生します。
同じクラスファイルがメモリから何度もロードされていると思います。
ロードされたクラスをメモリからクリアする方法はありますか?
コンパイル:
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();
コンパイルされたクラス ファイルを逆コンパイラでチェックしたところ、コードが更新されましたが、以前のクラス ファイルがクラス ローダーによってメモリからロードされている理由がわかりません。