Путаница в именах пакетов Java и классов - PullRequest
0 голосов
/ 16 июля 2010

Предположим, куда-то я импортирую javax.servlet.http.HttpServlet.

Мои вопросы:

  1. Означает ли это: я мог бы найти структуру папок, например, javax / servlet / http, где-нибудь внутри этого файла HttpServlet.class?

  2. Если нет, где именно можно найти этот файл класса?

  3. Означает ли это: это просто вложенные пространства имен, не имеющие отношения к структурам папок?

  4. Имя пакета в вышеупомянутом импорте будет javax.servlet или javax.servlet.http? Возможно, оба пакета, и первый супер пакет последующего?

  5. Как этот файл класса фактически включен? Я прочитал, что импорт не похож на c / c ++ include.

Спасибо.

Ответы [ 6 ]

2 голосов
/ 16 июля 2010

1 - Означает ли это: я мог бы найти структуру папок, такую ​​как javax/servlet/http, где-то внутри этого файла HttpServlet.class?

В этом случае, вероятно, не вфайловая система как таковая.(Этот класс является частью библиотек времени выполнения J2SE.)

2 - Если нет, где именно можно найти этот файл класса?

В файле JAR, которыйна пути к классам или загрузке вашего JVM.Файл JAR представляет собой архив, содержащий .class файлы и другие ресурсы.Путь к классу в файле JAR будет /javax/servlet/http/HttpServlet.class.(В этом случае класс в файле rt.jar.)

3 - Означает ли это: Это просто вложенные пространства имен, не имеющие отношения к структурам папок?

Нет.Если в вашем пути к классам есть папки файловой системы, их можно искать, чтобы найти классы, до или после файлов JAR, в зависимости от того, где они находятся в пути к классам.Путь к классам эффективно перекрывает пространства имен.Пространства имен файлов JAR могут перекрывать пространства имен папок файловой системы и наоборот, в зависимости от эффективного пути к классам.

4 - имя пакета в вышеупомянутом импорте будет javax.servlet или javax.servlet.http?

javax.servlet.http

4 продолжение - Возможно, оба являются пакетами, и первый из них является супер-пакетом последнего?

Оба являются пакетами, но в Java нет такого понятия, как «супер пакет».Что касается языка Java, то javax.servlet и javax.servlet.http не связаны между собой.Некоторые люди могут сказать, что javax.servlet является родительским пакетом javax.servlet.http, но это утверждение не имеет внутреннего значения с точки зрения языка Java.Кажущиеся родительско-дочерние отношения являются чисто традиционными.

5 - Как этот файл класса на самом деле включен?Я прочитал, что импорт не похож на C / C ++ include.

Файл класса не включен ни в каком смысле.Java import - это не что иное, как сокращение, которое позволяет вам ссылаться на импортированное имя без указания его полного имени пакета.

2 голосов
/ 16 июля 2010
  1. да

  2. см. 1.

  3. см. 1.

  4. имя пакета javax.servlet.http

  5. Загрузчик классов найдет класс (из его пути к классам) во время выполнения

2 голосов
/ 16 июля 2010
  1. Да
  2. Может также находиться в файле jar (в каталоге javax / servlet / http)
  3. Нет (см. 1.)
  4. Подробнееточнее, это родительский пакет
  5. Imports предоставляет доступ к классам, внешним по отношению к компилируемому файлу.Файл .class содержит ссылки на внешние классы, которые ему нужны.Константы (конечные статические переменные) могут быть встроены (их значения вставляются компилятором в код, который их использует).
1 голос
/ 16 июля 2010

A полное имя класса состоит из one имени пакета (пространства имен) и имени класса.Давайте рассмотрим простой пример:

 java.lang.Object

(простое) имя класса - Object, имя пакета - java.lang.В JLS есть практическая рекомендация создать имя пакета с идентификаторами, разделенными точками.Это практично, потому что таким образом мы можем сопоставить имя пакета со структурой папок.Имя пакета из приведенного выше примера сопоставляется с ./java/lang, полное имя класса - с файлом ./java/lang/Object.class для двоичного файла и ./java/lang/Object.java для исходного файла.

Это делает загрузчик классов довольно простым для:найти файлы классов в файловой системе.Загрузчик классов просто оценивает пространство имен (имя_пакета) для папки и простое имя класса для имени файла класса.

Распространенным заблуждением является мышление, названия пакетов являются несколько иерархическими.Это неправда.Между пакетами com.example.bean и com.example.bean.impl нет никакой связи.Первый не является своего рода родительским пакетом.

1 голос
/ 16 июля 2010

Означает ли это: я мог найти папку структура как javax / servlet / http где-то и внутри этого Файл HttpServlet.class будет нет?

Да (скорее всего, упакован в файл jar)

Package name in the above mentioned import would be

javax.servlet или javax.servlet.http? Вероятно, оба пакета и первый один супер пакет из более позднего?

Да, снова

Как этот файл класса на самом деле включено? Я прочитал импорт не нравится c / c ++ include.

import packagename.classname и должно быть до объявления класса, например:

import javax.servlet.http.HttpServlet;
0 голосов
/ 16 июля 2010

Для ответа чуть более высокого уровня: имя пакета - это способ создания пространства имен - нет иерархии пространств имен.Однако фактический класс (с использованием полного имени, например, javax.servlet.http.HttpServlet) должен быть загружен ClassLoader.

Стандартный болотный ClassLoader, который используется JVM, является экземпляром java.net.URLClassLoader(ну, подкласс).Это может искать классы, заданные отправной точкой или каталога или файла JAR.Имя пакета накладывается поверх структуры файловой системы для определения местоположения класса.

Существуют и другие загрузчики классов - большинство также в некоторой степени следуют этому соглашению, но это всего лишь соглашение.Загрузчики классов могут загружать классы по своему усмотрению, в том числе динамически генерировать их.

Для javax.servlet.http.HttpServlet вы, вероятно, найдете файл класса внутри jar-файла, называемого как servlet.jar или j2ee.jar.Есть полезная утилита под названием JFind , которая поможет вам найти место, где можно найти класс - это также обычно довольно просто в среде IDE.

Для вопроса 5 - как уже упоминали другие,оператор import просто переносит импортированный класс или пакет в локальное пространство имен, позволяя вам использовать удобное короткое имя HttpServlet вместо использования длинного имени javax.servlet.http.HttpServlet каждый раз, когда вам нужно обратиться к нему.Вы можете программировать на Java и никогда не использовать оператор импорта, если хотите, хотя люди, вероятно, будут на вас странно смотреть.

...