如何在Java中卸载已加载的类?

如何从类加载器中卸载一个类,以便我可以动态使用最近更改的类而无需重新启动我的应用程序(热部署)? 有可能吗?

Java反叛者即时重新加载更改的类。 有关详细信息,请访问jrebel网站 。 由于性能问题,我不知道我会为生产环境推荐这个。 当您重新编译服务器时,JRebel偶尔会陷入困境。

您无法卸载实际使用的类。 但是,如果要在运行时重新加载或重新部署应用程序,可能需要查看OSGi等平台。

您无法显式卸载类。

原则上,您可以通过Classloader.loadClass()显式重新加载类。 从那一刻起,该类的所有新实例都将使用新定义。

无论如何,我会非常谨慎地进行……

您必须创建一个自定义ClassLoader :它返回包含在Proxy中的所有ObjectClassLoader必须具有所有引用代理的列表(保留此列表WeakReference d)。 如果您决定“卸载”并因此“重新加载”任何类,则等待直到加载该类,找到列表中的所有代理,并替换实际对象。

有几个问题:您需要Reflection,获取所有私有变量并重置内部状态(请参阅Field setAccesible )。 此外,multithreading问题可能会出现,因此必须同步Proxy:这使得它表现不佳。

您可以更好地查找Google的Guice依赖项解决方案,该解决方案可以在运行时拔出和重新加载模块。 这可能是一个解决方案,但对于一个小应用来说太过臃肿了。 仍然:我不确定GC是否还卸载了未使用的类。