К сожалению, @ Dinesh / @ DAJ ответ неверный.(Возможно, @ Romain тоже, но формулировку трудно разобрать.)
Предположим, у вас есть класс a.b.C
, и вы договорились, что один и тот же класс загружается двумя разными загрузчиками классов.В соответствии со спецификациями у вас получится два отдельных Class
объекта с полностью определенным именем a.b.C
, а с точки зрения системы типов - два разных типа.Каждый из типов будет иметь различный набор статических переменных.
Основная ссылка для этого - JLS 4.3.4 - параграфы 2 и 3.
Можно сделать выводчто каждый ссылочный тип, который отличается (во время выполнения), будет иметь отдельный набор статики из JLS 4.12.3 , JLS 8.3.1.1 , JLS 12.4 ,и другие части спецификации языка.
В общем, всегда будет верно следующее утверждение:
A.loadClass("MyClass").getField("myField").get(null)
.equals(B.loadClass("MyClass").getField("myField").get(null));
В общем случае это не так.
Это всегда будет истинно в некоторых случаях, в зависимости от того, как MyClass
инициализирует myField
.Например, если поле инициализируется литеральной строкой, оно будет.
(Хитрость в наблюдении за этим заключается в том, чтобы MyClass
действительно загружалось двумя загрузчиками классов A
и B
, а не общим загрузчиком классов предка.)