Java 动态重新加载jar文件内容
我的应用程序的类路径中有一个jar文件。在运行时,我向jar文件添加新类,有时还修改现有类的字段/方法。目前我正在使用URLClassLoader动态加载类。动态添加的新类被正确加载,我能够在运行时使用它们。但它无法重新加载在运行时修改的现有类。我读过许多文章,其中指出我们需要显式地处理重载,因为类一旦被加载,在所有对该类的引用被销毁之前不会被重载。我还尝试了我找到的示例代码,但没有一个有效Java 动态重新加载jar文件内容,java,dynamic,bytecode,dynamic-class-loaders,Java,Dynamic,Bytecode,Dynamic Class Loaders,我的应用程序的类路径中有一个jar文件。在运行时,我向jar文件添加新类,有时还修改现有类的字段/方法。目前我正在使用URLClassLoader动态加载类。动态添加的新类被正确加载,我能够在运行时使用它们。但它无法重新加载在运行时修改的现有类。我读过许多文章,其中指出我们需要显式地处理重载,因为类一旦被加载,在所有对该类的引用被销毁之前不会被重载。我还尝试了我找到的示例代码,但没有一个有效 有人能给我建议一个重新加载的正确方法吗?任何相同的示例代码都将受到高度赞赏 通常,要重新加载类,需要卸载
有人能给我建议一个重新加载的正确方法吗?任何相同的示例代码都将受到高度赞赏 通常,要重新加载类,需要卸载整个类加载器。i、 删除对该类加载器加载的所有类的所有引用 另一种选择是使用检测来更改现有类的字节码。这通常是有限制的,更改字段是您无法做到的。i、 这种类型的对象必须以某种方式进行翻译 我通常做的是提供启动/重启速度非常快的服务。通过这种方式,您可以轻松地重新启动需要更新代码的进程,理想情况下,可以按my IDE中的
Run
。这也最大限度地减少了部署时间
URLClassLoader
有一个问题,那就是jar文件保持打开状态URLClassLoader
的不同实例从一个jar文件加载了多个类,并且在运行时更改了jar文件,则通常会出现以下错误:java.util.zip.ZipException:ZipFile无效LOC头(错误签名)
。错误可能不同URLClassLoader
s使用close
方法。但这是一个实际导致整个应用程序重新启动的解决方案更好的解决方案是修改
URLClassLoader
,以便将jar文件的内容加载到RAM缓存中。这不再影响从同一jar文件读取数据的其他URLClassloader
s。然后,可以在应用程序运行时自由更改jar文件。例如,您可以使用对URLClassLoader
的修改来实现以下目的:发布您的代码。我已经在我的一个项目中做了类似的事情。只有当我看到代码时,我才能帮助你。你能给我一些重新加载类的示例工作代码吗。这真的很有帮助。我尝试了文章中介绍的一些方法,但没有成功。你能确认你愿意卸载类加载器和任何加载的类吗?我向你们展示一个你们不能使用的复杂例子是毫无意义的。是的,我愿意卸载它。你能提供一些有帮助的示例吗?创建一个实例计数器以确保没有活动实例