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

我可以动态卸载和重新加载(相同版本的其他版本)JAR吗?

公西博实
2023-03-14
问题内容

我正在编写一个服务器程序,该程序用于运行API的单元测试 (显示大量信息并提供Web访问以控制/监视整个事情)…

服务器在编译知道 该API,并以JAR的形式提供。

为了能够在 不同版本
的API的单元测试结果之间进行比较(而无需重新启动服务器),我希望能够卸载“当前”版本的API,并重新加载较新的版本(或较旧的版本) 。

我不想使用URLClassLoader并按名称调用每个方法
(使用 getDeclaredMethod("someMethod") ),
因为服务器严重依赖于API,以这种肮脏的方式“包装”每个方法调用会很复杂。

我在想:既然所有接口 全部 的JAR的版本是 相同的
,我不能用某种方式重新加载JAR的其他版本做到这一点(不通过名称管理invokation?)。

注意:我正在使用最新的Java SE(6)和Java EE(5)。

如果您认为我无法实现的目标,请提出“解决方法”或其他概念。


问题答案:

我认为如果您使用

Class.forName(clsname, init, classloader);

(此处为Javadoc),您将获得给定类加载器提供的类的实例。由于该类而加载的所有内容也将通过相同的类加载器进行加载。

只要您对从此刻起实例化的对象非常谨慎(以允许使用GC),您就应该能够重新加载不同的版本。我以前使用Java
1.3进行过一次调试,但是它花费了大量的调试时间,但是最后我有了一个“
bootstrap”应用程序,该应用程序Runnable按名称加载了一个类,并且能够通过针对另一个实例化一个新的类加载器来“软重启” URL并再次输入。



 类似资料:
  • 我的Mac上目前有Java8(1.8.0_261),我和IntelliJ一起使用。但是我的学院需要最新的java,所以我今天安装了Java14.0.1。我如何从我的Mac上卸载Java8,因为我不再需要它了。谢谢你花时间读这篇文章。

  • 问题内容: 在开发Python代码时,通常会在解释器中以即席方式对其进行测试。我将对其进行测试,找到一个错误,修复该错误并保存,然后使用内置函数进行再次测试。 但是,假设我有,并且在测试时发现了一个错误并进行了修复。现在调用不会递归地重新导入。我必须手动重新导入依赖项(通过执行类似,或的操作,或者,如果我更改了一大堆依赖项并丢失了需要重新加载的内容的信息,则需要重新启动整个解释器。 更为方便的是,

  • 问题内容: 我正在编写一个具有静态外部“外壳”和动态内容部分的Web应用程序。用户浏览系统时,动态内容部分具有许多更新。加载新的内容块时,还可以选择加载另一个JavaScript文件。我以良好的内务管理名义,从DOM中删除了适用于旧内容块的脚本块,因为不再需要JavaScript。 接下来是问题,当我意识到尽管我已经从DOM中删除了该元素,但是先前评估过的JavaScript仍然可以执行。这当然是

  • 我怎样才能把它完全移除并重新安装一个新的?

  • 我试图在我的bash脚本中从Sourceforge下载最新版本的graphicsmagick 问题是当我试图提取tar.gz我得到以下错误 这意味着脚本不是在下载最新的tar.gz而是下载另一种文件类型? 为什么会这样,我错过了什么?

  • 我想下载旧版本的Android SDK:21.0.0,在哪里可以下载? 我目前有最新版本的android SDK,从这里下载。 然而,我想要一个旧版本,完整的旧版本的SDK可以从任何地方下载吗? 我正在尝试使用SDK管理器获取旧版本,但它不起作用。一、 它只给我构建工具等。