gpt4 book ai didi

java - tomcat - 动态重新加载类

转载 作者:行者123 更新时间:2023-11-28 22:05:04 25 4
gpt4 key购买 nike

我有一个包含很多 .class 文件的文件夹。该类从 'app 1' 更新。还有 'app 2' 动态加载这些类。

问题是......

'app 2' 使用类文件,'app 1' 更新该文件,然后'app 2' 再次需要该类但它似乎保留并使用旧类的副本。

因此,我检查了文件夹并成功更新了类,我尝试重新加载 'app 2' 但它继续使用旧类。

只有当我重新启动 tomcat 'app 2' 时才会读取新类。

这是为什么呢?我可以重新加载 'app 2' 但是,在生产环境中,我无法重新启动 tomcat。

这对我的工作非常重要,我很欣赏任何想法......

我使用的是全新安装的 tomcat6,我加载了类文件: Class.forName(<classname>).newInstance()

非常感谢

最佳答案

问题是运行时已经将旧的类文件加载到要使用修改后的类的代码正在使用的类加载器中。您必须找到一种方法让类加载器从磁盘刷新其类内容才能实现您想要的。这就是 Class.forName() 不起作用的原因:它正在访问该类的已加载(和缓存)版本。 Alex R 是对的,您应该尝试重构您的代码以分离这两个项目的类。但是,如果您执意要重新加载该类并保持原样,您可以尝试使用 Classloader.defineClass() 并将该类的新版本从其 .class 文件加载到 byte[] ,然后将该 byte[] 传递给 Classloader.defineClass()。您很可能希望通过 Tomcat 使用与您的应用程序关联的上下文类加载器(而不是顶级 Tomcat 类加载器)。 Tomcat 项目文档中有区分两者的文档。

关于java - tomcat - 动态重新加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com