Проблемы с кастингом / загрузчиком классов в Java - PullRequest
3 голосов
/ 08 января 2010

Вот упрощенная версия задачи:

 SomeClass c = (SomeClass) obj.getSomeClassParent()

не всегда, но иногда случается, что запускается исключение

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

Как это возможно? Я предполагаю, что это как-то связано с тем, что JAI imageio является родной библиотекой, но как это может произойти? Я, наверное, что-то упустил, но что?

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

Исключительное изображение http://img215.imageshack.us/img215/3894/exception.jpg

Ответы [ 4 ]

8 голосов
/ 08 января 2010

Я думаю, что это может произойти, если

  1. экземпляр SomeClass был загружен из ClassLoader X (поэтому его класс SomeClass из CL X или давайте назовем его: CL(X).SomeClass)
  2. но он загружается в загрузчик другого класса. Например. текущий загрузчик класса Threads - Y, поэтому SomeClass на самом деле CL(Y).SomeClass

Итак, у вас есть:

  • экземпляр класса = CL(X).SomeClass
  • цель класса класса = CL(Y).SomeClass

Или другими словами - не тот же класс - таким образом, исключение приведения класса.


Возможный дубликат: ClassCastException при приведении к тому же классу - у него также есть несколько хороших предложений.

2 голосов
/ 12 мая 2011

Я думаю, у вас есть проблемы из-за несоответствия между загрузчиками классов и нативными библиотеками. нативные библиотеки загружаются и связываются с загрузчиком классов, однако программы могут только реально загрузить один экземпляр нативной библиотеки. поэтому, если вы загрузите собственную библиотеку в загрузчик классов A, и классы, которые она выводит, будут связаны с загрузчиком классов A. Если вы позже загрузите ту же собственную библиотеку в загрузчик классов B, вы на самом деле не загружаете ее снова, и она все равно будет Прохождение классов для загрузчика классов A. Итак, вы либо повторно развернули свое веб-приложение, либо у вас есть 2 веб-приложения на одном веб-сервере, которые используют одну и ту же нативную библиотеку.

если возможно, вы должны попытаться поместить нативную библиотеку в базовый путь к классу веб-сервера, чтобы он загружался базовым загрузчиком классов и, следовательно, мог использоваться любым веб-приложением. если вы не можете сделать это, и проблема заключается только в проблеме повторного развертывания, то вы можете захотеть отменить развертывание и немного подождать перед повторным развертыванием (теоретически, собственная библиотека lib будет выгружена, когда загрузчик классов, с которым она связана, является GCed, но, конечно, это может занять неизвестное количество времени).

1 голос
/ 08 января 2010

Из изображения видно, что это выглядит как веб-приложение. Я читаю «Каталина». Так что есть большая вероятность, что это чисто проблема загрузки классов.

Это может произойти, например, если ImageReader, полученный из класса ImageIO, был загружен другим загрузчиком классов (возможно, потому что он развернут в другом веб-приложении), поэтому объект DicomImageReadParam, возвращаемый методом getDefaultReadParam (), является экземпляром - технически - другой класс.

1 голос
/ 08 января 2010

Странно, вы пытались привести его к объекту, который он расширяет, не уверен, что он обладает необходимой вам функциональностью, но, возможно, стоит попытаться выяснить, вызывает ли он все еще исключение.

...