Можно ли загрузить в JVM два класса с одинаковым полным именем?

«Можно ли загрузить в JVM два класса с одинаковым полным именем?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, можно, если эти классы загружены разными загрузчиками классов (ClassLoader). Каждый загрузчик создает собственное пространство имен (namespace).

Пример:

ClassLoader loader1 = new URLClassLoader(new URL[]{new File("app1.jar").toURI().toURL()});
ClassLoader loader2 = new URLClassLoader(new URL[]{new File("app2.jar").toURI().toURL()});

Class<?> classA1 = loader1.loadClass("com.example.MyClass");
Class<?> classA2 = loader2.loadClass("com.example.MyClass");

System.out.println(classA1 == classA2); // false — это разные классы для JVM

Практическое применение и предостережения:

  • Изоляция приложений: Этот механизм используется в сервлет-контейнерах (например, Tomcat) для изоляции веб-приложений.
  • Конфликты типов: Объекты этих классов не будут взаимозаменяемы, даже если они имеют одинаковую структуру. Это может привести к ClassCastException при попытке приведения типов или взаимодействия через общий интерфейс, загруженный другим класслоадером.