Ответ
Да, можно, если эти классы загружены разными загрузчиками классов (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при попытке приведения типов или взаимодействия через общий интерфейс, загруженный другим класслоадером.