2014-11-10 5 views
-1

Можно ли определить собственный класс String, который имеет то же имя, что и java.lang.String? Мое предположение заключается в том, что после того, как я определил его, я могу использовать его напрямую или загрузить его с помощью загрузчика классов.Можно ли определить собственный класс String?

Извините, код, написанный мной, имеет ошибку. Класс String параметра String [] args метода main() неверно ссылался на мою собственную определенную String. Вот почему произошла ошибка компиляции. Мой рабочий результат состоит в том, что мы можем определить класс с именем String в моем собственном пространстве имен или java.lang. Но поскольку JVM загрузил java.lang.String по умолчанию, мы не можем загрузить нашу собственную String и использовать ее.

+1

Вы даже попробовали? – ben75

+4

Все возможно, если верить. – Maroun

+3

Вам нужен собственный класс String в пространстве имен java.lang или в вашем собственном пакете? –

ответ

8

Да, вы можете определить этого класса, но вы не сможете использования его. Класс java.lang.String будет загружен из JRE при загрузке, и вы не сможете перезагрузить класс в загрузчике классов bootstrap. Если вы попытаетесь использовать свой собственный загрузчик классов, JVM заметит, что java.lang.String уже загружен и просто использует его.

От the JLS section on class loading:

  • Учитывая то же имя, хороший загрузчик класса должен всегда возвращать один и тот же объект класса. (Это означает, что java.lang.String класс, который получает тянут в загрузчике будет авторитетный класс.)
  • Если загрузчик класса L1 (начальный загрузчик) делегатов загрузка класса C на другой погрузчик L2 (ваш собственный загрузчик), то для любого типа T (java.lang.String), который встречается как прямой суперкласс или прямой суперинтерфейс C, или как тип поля в C или как тип формального параметра метода или конструктор в C, или как возвращаемый тип метода в C, L1 и L2 должны возвращать тот же объект Class. (Ваш собственный java.lang.String будет противоречить всем параметрам и полям во всем, что загружается загрузчиком начальной загрузки, и фактически приведет к сбою загрузки вашего класса-изгоя с ошибкой ссылок или литьем.)

Что именно вы пытаетесь сделать, во всяком случае? java.lang.String имеет очень строго определенную семантику, и изменение ее поведения вообще нарушит огромное количество кода.

+0

Вы можете создать свой собственный загрузчик классов, который возвращает ваш класс, когда его попросят загрузить 'java.lang.String'. Или рассматриваются системные классы? – immibis

+0

@immibis Это не так много * системных * классов, которые загружаются в более высокий класс загрузчика классов, которые вы не можете контролировать. Очень похожая ситуация в контейнерах приложений, где контейнер предоставляет классы API, такие как API сервлета. – chrylis

Смежные вопросы