【问题标题】:How to unload an already loaded class in Java? [duplicate]如何在 Java 中卸载已加载的类? [复制]
【发布时间】:2010-01-19 18:28:19
【问题描述】:

如何从类加载器中卸载一个类,以便我可以在不重新启动应用程序的情况下即时使用最近更改的类(热部署)?有可能吗?

【问题讨论】:

标签: java classloader


【解决方案1】:

Java rebel 即时重新加载更改的类。见the jrebel website for details。不过,由于性能问题,我不知道我会在生产环境中推荐这个。当您为服务器重新编译时,JRebel 有时会暂时停止运行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你不能显式卸载一个类。

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

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

      【讨论】:

        【解决方案4】:

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

        有几个问题:您需要反射,以获取所有私有变量并重置内部状态(请参阅 Field 上的 setAccesible)。还可能出现多线程问题,因此代理必须同步:这使其性能不佳。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-14
          • 2013-08-15
          • 1970-01-01
          • 2018-07-05
          • 2011-04-26
          • 2012-06-14
          • 1970-01-01
          相关资源
          最近更新 更多