Java 如何在不同的类加载器之间共享对象?

Java 如何在不同的类加载器之间共享对象?,java,classloader,Java,Classloader,我需要不同的类加载器来卸载类。但是我需要在它们之间共享对象(实际上我得到了ClassCastException)。那么,解决这个问题的办法是什么呢?。感谢来自不同类加载器的对象可以通过接口和由公共类加载器加载的类相互交互。使用单独类加载器的主要目的之一是防止您尝试执行的操作。安全性和名称冲突是保持这种隔离的良好原因。这里有一些方法可以避免这种孤立 使用公共类装入器 跨集群共享库 将一个应用程序的客户端JAR打包到另一个应用程序中 应用 请参阅此处了解更多详细信息。还将提到,如果您使用接口,则可以

我需要不同的类加载器来卸载类。但是我需要在它们之间共享对象(实际上我得到了ClassCastException)。那么,解决这个问题的办法是什么呢?。感谢

来自不同类加载器的对象可以通过接口和由公共类加载器加载的类相互交互。

使用单独类加载器的主要目的之一是防止您尝试执行的操作。安全性和名称冲突是保持这种隔离的良好原因。这里有一些方法可以避免这种孤立

  • 使用公共类装入器

  • 跨集群共享库

  • 将一个应用程序的客户端JAR打包到另一个应用程序中 应用


  • 请参阅此处了解更多详细信息。

    还将提到,如果您使用接口,则可以使用java.lang.reflect.Proxy创建类加载器本地接口的实例,该实例在后台通过反射从其他类加载器调用“真实”(外来)对象。这很难看,如果参数或返回类型不是基元,那么您只需将ClassCastException传递到下一行。虽然您可以装配一些东西来实现这一点,但一般来说,最好是使用一个父类加载器和一些您希望能够跨类加载器使用的共享类型,或者使用一个更。。。用于通信的序列化格式(较慢),或仅共享处理原语的接口。

    我正在得到您的答案。但是我可以从外部对象获取实例并将其保存以直接使用吗?或者我需要一直使用接口来操作其他对象?Andy说得对。公共(父)类加载器定义接口。不同的类加载器加载接口(或公共父级)的实现。吃你的蛋糕吧。@Wyvern666,你可以直接使用其类是通过另一个类加载器定义的实例,但只能通过父类加载器定义的编译时类型。共享对象的两个插件需要引用对象,对象需要实现由父类加载器加载的类型。这可以使用父级使用的相同接口或不同的接口来完成。这里的关键点是插件类加载器在加载自己的类副本之前委托给它们的父类。因此,如果你在父类加载器的类路径中包含接口类型,那么两个插件类加载器都应该通过父类加载器获得相同的类。我在Google快速搜索中找到的一个例子是1996年,在第4页的中间:。嗯,让我看看,我有一个可插入的应用程序,所以我每个插件有一个类加载器。在这些插件之间共享数据是一个错误的决定吗?这取决于插件是否可信。是的,事实上,这些插件可以访问主要的应用程序类,但我不能做的是插件“相互看到”。我知道对于Oracle application Server,应用程序之间存在父子关系,所以,多个子应用程序可以从同一父应用程序继承库。Weblogic使用模板扩展域。尝试在容器中探索类似的东西。