Как уже говорилось ранее, ваш код будет работать, если у вас не загружены одинаковые классы на двух разных загрузчиках классов.
Это может произойти в том случае, если вам нужно одновременно хранить несколько версий одного и того же класса в памяти, или вы выполняете какие-то странные компиляции на лету (как и я).
В этом случае, если вы хотите считать их одним и тем же классом (что может быть разумным в зависимости от ситуации), вы можете сопоставить их имена для сравнения.
public static boolean areClassesQuiteTheSame(Class<?> c1, Class<?> c2) {
// TODO handle nulls maybe?
return c1.getCanonicalName().equals(c2.getCanonicalName());
}
Имейте в виду, что это сравнение будет делать то, что оно делает: сравнивать имена классов; Я не думаю, что вам удастся привести одну версию класса к другой, и, прежде чем заглянуть в рефлексию, вы можете убедиться, что есть веская причина для беспорядка в загрузчике классов.