Java ClassLoader:加载相同的类两次

cte*_*ekk 2 java compiler-construction class

我有一个ClassLoader加载JavaCompiler源文件编译的类.但是当我更改源文件,保存并重新编译它时,ClassLoader仍会加载该类的第一个版本.

   ClassLoader cl = Thread.currentThread().getContextClassLoader();
   Class<?> compiledClass = cl.loadClass(stringClass);
Run Code Online (Sandbox Code Playgroud)

我错过了什么?喜欢newInstance还是什么?

And*_*s_D 11

类加载器不能替换已加载的类.loadClass将返回现有Class实例的引用.

您必须实例化一个新的类加载器并使用它来加载新类.然后,如果你想"替换"这个类,你将不得不抛弃这个类加载器并创建另一个新类.


回应你的评论:做类似的事情

ClassLoader cl = new UrlClassLoader(new URL[]{pathToClassAsUrl});
Class<?> compiledClass = cl.loadClass(stringClass);
Run Code Online (Sandbox Code Playgroud)

这个类加载器将使用"默认委托父类ClassLoader",你必须小心,该类(由它完全限定的类名称标识)尚未加载,并且不能由该父类加载器加载.所以"pathToClassAsUrl"不应该在类路径上!