如何在Java中卸载已加载的类?
如何从类加载器中卸载一个类,以便我可以动态使用最近更改的类而无需重新启动我的应用程序(热部署)? 有可能吗?
Java反叛者即时重新加载更改的类。 有关详细信息,请访问jrebel网站 。 由于性能问题,我不知道我会为生产环境推荐这个。 当您重新编译服务器时,JRebel偶尔会陷入困境。
您无法卸载实际使用的类。 但是,如果要在运行时重新加载或重新部署应用程序,可能需要查看OSGi等平台。
您无法显式卸载类。
原则上,您可以通过Classloader.loadClass()显式重新加载类。 从那一刻起,该类的所有新实例都将使用新定义。
无论如何,我会非常谨慎地进行……
您必须创建一个自定义ClassLoader
:它返回包含在Proxy中的所有Object
。 ClassLoader
必须具有所有引用代理的列表(保留此列表WeakReference
d)。 如果您决定“卸载”并因此“重新加载”任何类,则等待直到加载该类,找到列表中的所有代理,并替换实际对象。
有几个问题:您需要Reflection,获取所有私有变量并重置内部状态(请参阅Field
setAccesible
)。 此外,multithreading问题可能会出现,因此必须同步Proxy:这使得它表现不佳。
您可以更好地查找Google的Guice依赖项解决方案,该解决方案可以在运行时拔出和重新加载模块。 这可能是一个解决方案,但对于一个小应用来说太过臃肿了。 仍然:我不确定GC是否还卸载了未使用的类。
- 如何在运行时在WAR中找到非Java资源?
- 如何防止具有META-INF \ services \ javax.xml.transform.TransformerFactory的xalan.jar接管内置在Xalan实现中的JDK 1.6?
- 有和没有getClassLoader的getResourceAsStream有什么区别?
- Java ASM字节码修改 – 更改方法体
- java.lang.LinkageError类加载错误
- getSystemResourceAsStream()返回null
- ClassLoader.getResources在Weblogic / Spring应用程序上返回一个空的Enumeration
- 什么加载java系统类加载器?
- 将Class对象转换为字节