← Назад к вопросам

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

1.7 Middle🔥 121 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Да, можно загрузить два класса с одинаковым именем

Ключевой момент — класс в JVM идентифицируется не только по имени, но и по ClassLoader, который его загрузил.

Идентификация класса в JVM

Класс полностью идентифицируется парой:

(Полное имя класса, ClassLoader)

Два класса считаются одинаковыми только если:

  1. Имеют идентичное полное имя (пакет + класс)
  2. Загружены одним и тем же ClassLoader

Если разные ClassLoader'ы загружают классы с одинаковым именем — это разные классы.

Практический пример

import java.net.URL;
import java.net.URLClassLoader;

public class DuplicateClassLoading {
    public static void main(String[] args) throws Exception {
        URL[] urls = {new URL("file:/path/to/classes/")};
        
        URLClassLoader loader1 = new URLClassLoader(urls);
        Class<?> class1 = loader1.loadClass("com.example.MyClass");
        
        URLClassLoader loader2 = new URLClassLoader(urls);
        Class<?> class2 = loader2.loadClass("com.example.MyClass");
        
        System.out.println("Одинаковые? " + class1.equals(class2)); // false
        System.out.println("Одинаковые? " + (class1 == class2));   // false
    }
}

Иерархия ClassLoader'ов

Бутстрап-загрузчик (JDK классы) → Расширения → Приложение → Кастомные загрузчики

Каждый уровень может загружать классы с одинаковыми именами.

Реальные сценарии

Plugin-архитектура — каждый плагин имеет свой ClassLoader

Container'ы — в одной JVM один набор loader'ов, в разных контейнерах разные JVM

OSGi — специально построен на этой возможности для загрузки разных версий библиотек

Проблемы

Object obj1 = class1.newInstance();
MyClass obj2 = (MyClass) obj1;  // ClassCastException!

Выводы

Возможность загружать классы с одинаковым именем через разные ClassLoader'ы — это мощный механизм для:

  • Plugin-систем
  • Динамической загрузки модулей
  • Работы с несовместимыми версиями библиотек

Но это требует осторожности и глубокого понимания механизма ClassLoader'ов.