Java转换/类加载器问题

Mit*_*ski 3 java java-native-interface casting classloader javax.imageio

以下是问题的简化版本:

 SomeClass c = (SomeClass) obj.getSomeClassParent()
Run Code Online (Sandbox Code Playgroud)

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

 org.somepackage.SomeClass can't be cast to org.somepackage.SomeClass 
Run Code Online (Sandbox Code Playgroud)

这怎么可能 ?我想这与JAI imageio是本机lib的事实有关,但是中继怎么会发生这种情况?我可能错过了什么,但是什么?

I'm using JAI imageio version 1.1 
dcm4che 2.0.21  DICOM lib
Run Code Online (Sandbox Code Playgroud)

这是原始代码

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

而原来的例外

org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam can't be cast to    
org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam
Run Code Online (Sandbox Code Playgroud)

异常图像http://img215.imageshack.us/img215/3894/exception.jpg

Era*_*dan 8

我想如果可能会发生

  1. 一个SomeClass实例是由类加载器加载X(所以它的类是SomeClassCL X或让我们叫它:CL(X).SomeClass)
  2. 但它正在使用不同的类加载器.例如,当前的Threads类加载器是Y,所以SomeClass实际上是CL(Y).SomeClass

所以你有了:

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

或者换句话说 - 不是同一个类 - 因此类强制转换异常.


在转换为同一个类时可能重复:ClassCastException - 它也有一些很好的建议.

  • 你基本上在这里.问题是每个实例都由不同的类加载器加载,因此每个实例上的getClass()将返回同一个类的不同实例.您应该对此进行一些编辑,因为在两个类加载器中加载了Class,而不是一个中的实例和另一个中的Class,这实际上是不可能的. (2认同)