Java铸造/classloader问题

 2023-01-20    293  

问题描述

这是问题的简化版本:

SomeClass c = (SomeClass) obj.getSomeClassParent()

并非总是如此,但有时会触发异常

Java铸造/classloader问题

org.somepackage.SomeClass can't be cast to org.somepackage.SomeClass

这怎么可能?我想这与Jai Imageio是本地Lib的事实有关,但是继电器怎么会发生?我可能错过了什么,但是什么?

I'm using JAI imageio version 1.1 
dcm4che 2.0.21  DICOM lib

这是原始代码

ImageInputStream iis = ImageIO.createImageInputStream(src);
  Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
  ImageReader reader = iter.next();
  DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();

和原始异常

org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam can't be cast to    
org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam

异常图像image Image http://img215.imagshack.us/img215/exception http:/img215/excectionion .jpg

推荐答案

我认为如果

  1. a SomeClass实例是从classloader x加载的(因此其类是cl x的SomeClass或我们称之为:CL(X).SomeClass)
  2. 但是它被施放在其他类加载程序中.例如.当前线程类加载程序是y SomeClass实际上是CL(Y).SomeClass

所以你有:

  • 实例class= CL(X).SomeClass
  • 类cast target = CL(Y).SomeClass

或换句话说 – 不是同一类 – 因此,类施放异常.


可能的重复: – 它也有一些很好的建议.

其他推荐答案

我猜想您由于classloaders和本机库之间的不匹配而有问题.本机库已加载并与ClassLoader关联,但是,程序只能真正加载本机库的一个实例.因此,如果将本机LIB加载到ClassLoader A中,并且输出的类将与ClassLoader A相关通过classLoaderA进行了类.因此,您要么重新部署了WebApp,要么在同一Web服务器中有2个WebApps使用同一本机库.

如果可能的话,您应该尝试将本机库放在Web服务器的基类路径中,以便由Base ClassLoader加载它,从而由任何WebApp使用.如果您不能这样做,而问题只是重新部署问题,那么您可能需要不放弃并等待一点(从理论上讲,当与与之关联的class Loader的GCED,GCED,GCED,,将本机LIB卸载但是,当然,这可能需要花费未知的时间).

其他推荐答案

奇怪的是,您是否尝试将其施放到它扩展的对象上,不确定它是否具有您需要的功能,但可能值得尝试查看它是否仍然引发异常.

以上所述是小编给大家介绍的Java铸造/classloader问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25995.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。