Да, ваше исследование указывает на правильное направление: одно и то же определение класса, загружаемое разными загрузчиками классов, рассматривается как два разных класса JVM. Таким образом, приведение между ними заканчивается с ClassCastException
.
Я думаю, что разница просто в том, что в игре есть два разных объекта токенов класса. Это должно быть так, поскольку классы, загружаемые разными загрузчиками, на самом деле могут быть разными версиями одного и того же класса. Известно, что маркер класса для каждого класса уникален (то есть в одной области загрузчика классов). Если бы JVM начала сравнивать токены классов по их различным атрибутам, а не по физическому равенству (==
), то это открыло бы банку с червями.