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

卸载Java中的类?

阎唯
2023-03-14
问题内容

我有一个自定义类加载器,以便桌面应用程序可以动态地开始从需要与之交谈的AppServer加载类。我们这样做是因为这样做所需的jar数量太可笑了(如果我们想发货的话)。如果我们没有在运行时从AppServer库动态加载类,就会遇到版本问题。

现在,我遇到一个问题,需要与两个不同的AppServer进行交谈,发现根据我首先加载的类,我可能会严重损坏…是否有任何方法可以在不杀死JVM的情况下强制卸载该类?

希望这有意义


问题答案:

可以卸载类的唯一方法是,如果使用的类加载器是垃圾回收。这意味着对每个单个类的引用以及对类加载器的引用都需要遵循dodo的方式。

一种可能的解决方案是为每个jar文件提供一个Classloader,为每个AppServer提供一个Classloader,以将类的实际加载委托给特定的Jar类加载器。这样,您可以为每个App服务器指向jar文件的不同版本。

不过,这并非微不足道。OSGi平台努力做到这一点,因为每个捆绑软件都有一个不同的类加载器,并且依赖项由平台解决。也许一个好的解决方案就是看看它。

如果您不想使用OSGI,则一种可能的实现方式是为每个JAR文件使用一个JarClassloader类实例。

并创建一个扩展Classloader的新的MultiClassloader类。此类在内部将具有JarClassloaders的数组(或List),并且在defineClass()方法中将迭代所有内部类加载器,直到找到定义或抛出NoClassDefFoundException为止。可以提供几个访问器方法以将新的JarClassloaders添加到该类。网上有多种针对MultiClassLoader的实现,因此您甚至不需要编写自己的实现。

如果为服务器的每个连接实例化MultiClassloader,则原则上每个服务器都可能使用同一类的不同版本。

我在一个项目中使用了MultiClassloader的想法,其中包含用户定义脚本的类必须从内存中加载和卸载,并且运行良好。



 类似资料:
  • 我需要取消扫描包含转义xml标记的xml字符串: 我确实找到了一些可以执行此任务的库,但我宁愿使用可以执行此任务的单个方法。 有人能帮忙吗? 干杯,Bas Hendriks

  • 我确实导航到了/Library/Java/JavaVirtualMachines并删除了jdk,但是那个文件夹中什么也没有了。但是我的终端显示我有一些java版本,所以我有点困惑,我想从我的笔记本电脑上完全卸载java。我也使用一组命令卸载了JRE。 复制的步骤 java-版本 输出: openjdk版本“1.8.0_152-release”openjdk运行时环境(内部版本1.8.0_152-r

  • 我有一个服务器,它有一个运行PHP5.6的应用程序。但我将服务器从Ubuntu 14.04升级到了18.04,在此过程中,我还将PHP升级到了7.2。现在我试图卸载它,但我发现很难。 我已经运行了命令: 和 它说PHP它没有安装,但是运行我仍然看到PHP的版本7。 PHP7.2。19-0ubuntu0。18.04.2(cli)(创建日期:2019年8月12日19:34:28)(NTS)版权所有(c

  • B.3.1 说明 UnInstallLib 宏用来卸载一个库。如果在卸载过程中发生了错误将会放置一个错误标记。 B.3.2 参数 库类型 是否共享 卸载方式 文件 库类型 库的类型 DLL - 动态链接库 (DLL) REGDLL - 要注册的 DLL TLB - 类型库或包含 LIBRARY 类型的 DLL REGDLLTLB - 要注册的 DLL 并包含类型库 是否共享 指定要卸载的库是否与其

  • 问题内容: 不久前,我在Mac OSX上使用以下命令安装了Node.js版本0.2.1: 我最近安装了Homebrew,所以现在我更喜欢使用它来管理我的安装。我今天使用以下命令安装了Node.js版本0.4.5: 酿造节点 但是我注意到我仍然在这些目录中找到旧版本的Node.js: 卸载使用sudo make技术安装的Node.js的正确方法是什么? 提前致谢 问题答案: 没有“正确”的方法。该只

  • 我已经成功使用MAMP PRO一年多了。最近,当我试图启动MAMP PRO时,它不会启动。我试图“恢复”,但没有成功。Appsolute技术支持建议卸载并安装新版本。MAMP PRO卸载程序不工作。我得到“特权操作失败”错误消息。我在"stackoverflow"上找到了这个解决方案 从 /Library/Application支持中删除appsolute目录,其中包含在MAMP Pro安装时创建