Смогут ли другие экземпляры класса получить доступ к статической переменной в другом? - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть класс, который, как я знаю, будет загружаться URLClassLoader для каждого его экземпляра, поэтому, если у меня есть статическая переменная в одном, будут ли другие экземпляры иметь к ней доступ?

Например,Класс MyClass загружается ClassLoader A и ClassLoader B, и я хочу знать, будет ли MyClass, загруженный A, иметь те же статические поля, что и MyClass, загружаемый B.

Таким образом, в принципе, следующий оператор всегда будет верным:

A.loadClass("MyClass").getField("MyField").get(null).equals(B.loadClass("MyClass").getField("MyField").get(null));

Ответы [ 3 ]

2 голосов
/ 09 февраля 2011

Статические переменные уникальны для загрузчиков классов. (Ссылки на них есть) Значения могут быть одинаковыми. Использование equals будет работать, использование == не будет.

РЕДАКТИРОВАТЬ: Каждый ClassLoader будет загружать свой класс (они могут даже быть разных версий). Инициализированная статика будет отличаться. Два разных класса из разных ClassLoaders могут иметь переменные (статические или нет), которые имеют одинаковые значения.

1 голос
/ 09 февраля 2011

К сожалению, @ 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, а не общим загрузчиком классов предка.)

0 голосов
/ 09 февраля 2011

AFAIK, не должно иметь значения, кто загружает класс. Пока поля являются статическими, они должны быть одинаковыми. Вы пытались поэкспериментировать с некоторым кодом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...