Scala - Динамическая загрузка классов - класс A не может быть приведен к классу A - PullRequest
6 голосов
/ 15 января 2012

У меня есть простой jar-файл, содержащий класс A:

public class A {}

Затем я загружаю его во время выполнения:

var classLoader = new URLClassLoader(Array(my_jar_file.toURI.toURL))
var clazz = classLoader.loadClass("A")

Это нормально, он может загружать класс A. Эта команда тоже в порядке:

clazz.newInstance

Но когда я приведу его к A:

clazz.newInstance.asInstanceOf[A]

Я получил эту ошибку:

java.lang.ClassCastException: A cannot be cast to A

Не могли бы вы мне помочь?

Ответы [ 2 ]

5 голосов
/ 15 января 2012

Ваш код подразумевает, что у вас есть "A", доступная в одном контексте classLoader, где вы вызываете clazz.newInstance.asInstanceOf [A], который является отдельным контекстом, из которого вы получаете объект clazz. Проблема в том, что у вас есть два разных экземпляра класса "A" в двух разных контекстах classLoader. Объект, созданный из одной версии класса "A", не может быть приведен к экземпляру другой версии. в другом контексте classLoader.

4 голосов
/ 14 августа 2012

У меня возникла очень похожая проблема: я наблюдал ClassCastException при приведении динамически загруженного объекта к реализованному им интерфейсу.
Благодаря ответу Нила я смог определить, что ClassCastException быловызвано наличием разных контекстов загрузчика классов.

Чтобы исправить это, я использовал конструктор URLClassLoader(URL[] urls, ClassLoader parent) вместо конструктора URLClassLoader(URL[] urls).

...