Например
import org.apache.nutch.plugin.Extension,
хотя используется много раз,
Я не очень понимаю, что сделано по существу.
EDIT: org.apache.nutch.plugin
по существу 4 каталога или менее 4, как каталог с именем org.apache
?
Например
import org.apache.nutch.plugin.Extension,
хотя используется много раз,
Я не очень понимаю, что сделано по существу.
EDIT: org.apache.nutch.plugin
по существу 4 каталога или менее 4, как каталог с именем org.apache
?
Я думаю, что вопрос, который вы, возможно, пытаетесь задать, - "Что такое пакеты на Java и как относится к ним ключевое слово import
?" . Ваша путаница в структурах каталогов может быть связана с тем, что на некоторых других языках есть директивы include
, которые используют имена файлов, чтобы буквально включать содержимое указанного файла в исходный код во время компиляции. C/С++ - примеры языков, которые используют этот тип директивы include
. Java import
не работает таким образом. Как говорили другие, ключевое слово import
- это просто сокращенный способ ссылки на один или несколько классов в пакете. Реальная работа выполняется загрузчиком классов Java Virtual Machine (подробнее см. Ниже).
Начнем с определения "пакета Java", как описано в статье Википедии:
Пакет Java - это механизм для организация классов Java в пространства имен, подобные модулям Modula. Пакеты Java могут быть сохранены в сжатые файлы, называемые JAR файлами, позволяя классам загружаться быстрее, чем группа, а не одна за раз. Программисты также обычно используют пакеты для организации классов к той же категории или предоставлению аналогичная функциональность.
В Java файлы исходного кода для классов фактически организованы по каталогам, но метод, с помощью которого виртуальная машина Java (JVM) находит эти классы, отличается от таких языков, как C/С++.
Предположим, что в вашем исходном коде есть пакет с именем "com.foo.bar", и внутри этого пакета у вас есть класс с именем "MyClass". Во время компиляции местоположение исходного кода этого класса в файловой системе должно быть {source}/com/foo/bar/MyClass.java
, где {source}
является корнем исходного дерева, которое вы компилируете.
Одно из различий между Java и языками, такими как C/С++, - это концепция загрузчика классов. На самом деле концепция загрузчика классов является ключевой частью архитектуры виртуальной машины Java. Задача загрузчика классов - найти и загрузить любые файлы class
, которые требуется вашей программе. "Первоначальный" или "по умолчанию" загрузчик классов Java обычно предоставляется JVM. Это обычный класс типа ClassLoader
и содержит метод loadClass()
со следующим определением:
// Loads the class with the specified name.
// Example: loadClass("org.apache.nutch.plugin.Extension")
Class loadClass(String name)
Этот метод loadClass()
попытается найти файл class
для класса с заданным именем и выдает class
объект, который имеет newInstance()
метод, способный создавать экземпляр класса.
Где загружает загрузчик классов для файла class
? В пути класса JVM. Путь к классу - это просто список мест, где можно найти файлы class
. Эти локации могут быть каталогами, содержащими class
файлы. Он может содержать даже jar
файлы, которые могут содержать даже больше class
файлов. По умолчанию загрузчик классов способен искать внутри этих файлов jar
для поиска файлов class
. В качестве дополнительной заметки вы можете реализовать свой собственный загрузчик классов, чтобы, например, разрешить поиск местоположений сети (или любого другого местоположения) для файлов class
.
Итак, теперь мы знаем, что "com.foo.bar.MyClass" находится в файле class
в вашем собственном исходном дереве или файле class
внутри файла jar
где-то в пути вашего класса, загрузчик класса найдет его для вас, если он существует. Если он не существует, вы получите ClassNotFoundException
.
И теперь для обращения к ключевому слову import
: Я расскажу о следующем примере:
import com.foo.bar.MyClass;
...
public void someFunction() {
MyClass obj1 = new MyClass();
org.blah.MyClass obj2 = new org.blah.MyClass("some string argument");
}
Первая строка - это просто способ сообщить компилятору "Всякий раз, когда вы видите переменную, объявленную просто как тип MyClass
, предположим, что я имею в виду com.foo.bar.MyClass
. Это то, что происходит в случае obj1
. obj2
, вы явно говорите компилятору" Мне не нужен класс com.foo.bar.MyClass
, я действительно хочу org.blah.MyClass
". Таким образом, ключевое слово import
- это просто простой способ сократить количество ввода программисты должны делать, чтобы использовать другие классы. Все интересные вещи выполняются в загрузчике классов JVM.
Для получения дополнительной информации о том, что делает загрузчик класса, я рекомендую прочитать статью под названием Основы загрузчиков классов Java
Все, что он делает, это сохранение ввода текста. Вместо того чтобы набирать "org.apache.nutch.plugin.Extension" каждый раз, когда вы хотите его использовать, импорт позволяет вам ссылаться на него по его короткому имени "Расширение".
Не путайте слово "import" - оно не загружает файл .class или что-то в этом роде. Погрузчик класса будет искать его на CLASSPATH и загружать его в пермское пространство при первом запросе кода.
UPDATE: как разработчик вы должны знать, что пакеты связаны с каталогами. Если вы создадите пакет "com.foo.bar.baz" в вашем .java файле, его нужно будет сохранить в каталоге com/foo/bar/baz.
Но когда вы загружаете JAR файл, например, такую библиотеку Apache Nutch, с вашей точки зрения нет каталогов. Человек, создавший JAR, должен был закрепить правильную структуру каталогов, которую вы можете увидеть как путь к файлу .class, если вы откроете JAR с помощью WinZip. Вам просто нужно поставить этот JAR в CLASSPATH для своего приложения, когда вы компилируете и запускаете.
Импорт - это всего лишь намеки на компилятор, рассказывающий ему, как определить полное имя классов.
Итак, если у вас есть "import java.util. *;" и в вашем коде вы делаете что-то вроде "нового ArrayList()", когда компилятор обрабатывает это выражение, ему сначала нужно найти полное имя типа ArrayList. Он делает это, переходя через список импорта и добавляя ArrayList для каждого импорта. В частности, когда он добавляет ArrayList в java.util, он получает FQN java.util.ArrayList. Затем он просматривает этот FQN в своем классе. Если он найдет класс с таким именем, тогда он знает, что java.util.ArrayList является правильным именем.
является "org.apache.nutch.plugin" по существу 4 каталога?
Если у вас есть класс с именем org.apache.nutch.plugin.Extension
, то он хранится где-то в пути к классам как файл org/apache/nutch/plugin/Extension.class
. Поэтому корневой каталог содержит четыре вложенных подкаталога ( "org", "apache", "nutch", "plugin" ), которые, в свою очередь, содержат файл класса.
import org.apache.nutch.plugin.Extension
- это ярлык времени компиляции, позволяющий ссылаться на класс Extension без использования полного имени класса. Это не имеет смысла во время выполнения, это всего лишь трюк времени компиляции, чтобы сохранить ввод.
По соглашению, файл .class для этого класса будет находиться в папке org/apache/nutch/plugin либо в файловой системе, либо в файле jar, любой из которых должен находиться в вашем пути к классам, как во время компиляции, так и во время выполнения. Если файл .class находится в файле jar, то этот файл jar должен находиться в вашем пути к классам. Если файл .class находится в папке, папка, которая является родительской папкой "org", должна находиться в вашем пути к классу. Например, если класс был расположен в папке c:\myproject\bin\org\apache\nutch\plugin, тогда папка c:\myproject\bin должна быть частью пути к классам.
Если вам интересно узнать, где был загружен класс при запуске вашей программы, используйте параметр командной строки -verbose:class
java. Он должен сообщить вам, какой файл папки или jar JVM нашел класс.
В принципе, когда вы делаете класс, вы можете объявить его частью пакета. У меня лично нет большого опыта работы с пакетами. Однако, afaik, это в основном означает, что вы импортируете класс Extension из пакета org.apache.nutch.plugin.
Отключение Thomas' answer, org.apache.nutch.plugin - это путь к файлам классов, которые вы хотите импортировать. Я не уверен в этом конкретном пакете, но обычно у вас будет файл .jar, который вы добавите в свой путь к классам, и ваш оператор импорта указывает на каталог "./[classpath]/[jarfile]/org/apache/Nutch/плагин"
у вас не может быть каталога с именем org.apache
в виде пакета. компилятор не поймет это имя и будет искать структуру каталогов org/apache
при импорте любого класса из этого пакета.
также не допускайте инструкции Java import
с инструкцией препроцессора C #include
. оператор import
, как они уже сказали, является сокращением для ввода меньшего количества символов при обращении к имени класса.