当前位置: 首页 > 面试题库 >

动态重新加载jar文件内容

赵飞雨
2023-03-14
问题内容

我的应用程序的类路径中有一个jar文件。在运行时,我将新类添加到jar文件中,有时还修改现有类的字段/方法。目前,我正在使用URLClassLoader来动态加载类。动态添加的新类可以正确加载,并且可以在运行时使用它们。但是,它无法重新加载在运行时修改的现有类。我读过许多文章,其中指出我们需要显式地处理重新加载,因为一旦加载了该类,则在销毁对该类的所有引用之前,都不会重新加载该类。我也尝试了发现的示例代码,但是没有一个起作用。

谁能建议我重新加载的正确方法?相同的任何示例代码将受到高度赞赏。


问题答案:

通常,要重新加载一个类,您需要卸载整个类加载器。即删除对为该类加载器加载的所有类的所有引用。

另一种选择是使用工具来更改现有类的字节码。这通常带有局限性,更改字段是您无法做到的。即该类型的对象将必须以某种方式进行翻译。

我通常所做的是提供可以快速启动/重新启动的服务。通过这种方式,您可以轻松地重新启动需要理想更新代码的进程,方法是Run在我的IDE中按。这样也可以最大程度地减少部署时间。



 类似资料:
  • 问题内容: 我正在尝试在Android平台上的运行时动态加载类。该类包含在单独的库JAR文件中,但与APK打包在一起(按照SDK中的新库机制)。使用Class.forname方法时,我收到未找到的类异常。我已经看到了有关DexClassLoader方法的一些讨论,但是我找不到如何使用它的好例子(以及是否是最好的使用方法- 它似乎比forname方法复杂得多!)。 如果有人可以提供示例代码片段来说明

  • 问题内容: 如何可靠,动态地加载JavaScript文件?这将用于实现模块或组件,该模块或组件在“初始化”时将根据需要动态加载所有需要的JavaScript库脚本。 使用该组件的客户端不需要加载实现该组件的所有库脚本文件(并将标记手动插入其网页),只需加载“主”组件脚本文件即可。 主流JavaScript库如何做到这一点(原型,jQuery等)? 这些工具是否将多个JavaScript文件合并到脚

  • 问题内容: 我正在尝试为我的应用程序创建一个插件系统,我想从简单的事情开始。每个插件都应打包在.jar文件中并实现接口: 现在,我创建了一个打包为.jar的实现,并将其放在主应用程序的plugin /子目录中: 在主应用程序中,我想获取一个实例。我尝试了两种选择,都使用。 1.动态扩展类路径 这使用已知的技巧在系统类加载器上使用反射来避免封装,从而添加类路径。 plugins /目录已按预期添加(

  • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法一样容易的事情来说是很多工作。 对执行此操作的简单代码有何建议? 问题答案: 很难的原因是安全性。类加载器是不可变的。你不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。

  • 问题内容: 为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成,但这对于(至少在我看来)应该像调用以JAR文件作为其参数的方法那样容易的事情来说是很多工作。 问题答案: 很难的原因是安全性。类加载器是不可变的。您不应在运行时随意向其添加类。实际上,我很惊讶能与系统类加载器一起使用。这是制作自己的子类加载器的方法:

  • 我正在使用Ansible来设置EC2实例并部署一个应用程序。有一个hosts脚本,它收集标签、相关服务器和分组信息。我想把这些动作作为一个剧本来运行,所以 如果需要,将创建新实例 主机脚本加载清单(包括服务器的事实) 部署剧本有效 但我还没找到一个命令让它翻倍。