Модель Java представляет собой набор классов, моделирующих объекты, связанные с созданием, изменением и компоновкой программы на Java. Классы модели Java определяются в пакете org.eclipse.jdt.core. Эти классы реализуют элементы Java для соответствующих ресурсов и затем представляют ресурсы Java в виде элементов модели.
Пакет org.eclipse.jdt.core определяет классы, моделирующие элементы, из которых состоит программа на Java. Для представления структуры (дерева) программы на Java JDT использует модель объекта "в памяти". Это дерево создается на основе пути к классам проекта. Модель имеет иерархическую структуру. Элементы программы можно "разложить" на дочерние элементы.
Действия над элементами Java подобны действиям над объектами ресурсов. При работе с элементом Java вы в действительности работаете с указателем на соответствующий ему объект модели. Для того чтобы определить, действительно ли данный элемент присутствует в рабочей области, следует использовать протокол exists().
Различные типы элементов Java объединены в следующую таблицу.
Элемент | Описание |
---|---|
IJavaModel | Представляет корневой элемент Java, соответствующий рабочей области. Это предок всех проектов с классификатором Java. Предоставляет также доступ к проектам без классификатора java. |
IJavaProject | Представляет проект Java в рабочей области. (Потомок элемента IJavaModel) |
IPackageFragmentRoot | Представляет набор фрагментов пакета и преобразует фрагменты в ресурс, который может быть папкой, файлом JAR или файлом ZIP. (Потомок элемента IJavaProject) |
IPackageFragment | Представляет часть рабочей области, соответствующий всему пакету или части этого пакета. (Потомок элемента IPackageFragmentRoot ) |
ICompilationUnit | Представляет файл исходного кода Java (.java). (Потомок элемента IPackageFragment) |
IPackageDeclaration | Представляет объявление пакета в единице компиляции. (Потомок элемента ICompilationUnit ) |
IImportContainer | Представляет набор объявлений импорта пакетов в единице компиляции. (Потомок элемента ICompilationUnit ) |
IImportDeclaration | Представляет отдельное объявление импорта пакета. (Потомок элемента IImportContainer ) |
IType | Представляет либо исходный тип внутри единицы компиляции, либо двоичный тип внутри файла класса. |
IField | Представляет поле внутри типа. (Потомок элемента IType ) |
IMethod | Представляет метод или конструктор внутри типа. (Потомок элемента IType ) |
IInitializer | Представляет статический инициализатор или инициализатор экземпляра внутри типа. (Потомок элемента IType ) |
IClassFile | Представляет откомпилированный (двоичный) тип. (Потомок элемента IPackageFragment ) |
Все элементы Java поддерживают интерфейс IJavaElement.
Некоторые элементы отображаются в панели Пакеты. Эти элементы реализуют интерфейс IOpenable , поскольку для того чтобы по ним можно было перемещаться, они должны быть предварительно открыты. На следующем рисунке показано, как эти элементы представляются в панели Пакеты.
Элементы Java, реализующие интерфейс IOpenable , создаются главным образом из информации, найденной в соответствующих им файлах ресурсов. Те же самые элементы в общем представлены в панели Навигатор ресурсов.
Другие элементы соответствуют элементам, из которых состоит единица компиляции Java. На приведенном ниже рисунке показана единица компиляции Java и группировщик содержимого, отображающий элементы исходного кода в единице компиляции.
Эти элементы реализуют интерфейс ISourceReference, поскольку они могут предоставлять соответствующий исходный код. (При выборе этих элементов в группировщике содержимого соответствующий им исходный код отображается в редакторе Java).
Общим ресурсам в рабочей области соответствуют многие элементы Java. Если из общего ресурса требуется создать элементы Java, в качестве отправной точки рекомендуется выбрать класс JavaCore. Следующий фрагмент кода показывает, как получить элементы Java из соответствующих ресурсов.
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) { IJavaProject myJavaProject= JavaCore.create(myProject); if (myJavaProject == null) // проект не настроен для Java (отсутствует классификатор Java) return; // получение фрагмента пакета или корневого фрагмента пакета IJavaElement myPackageFragment= JavaCore.create(myFolder); // получение файла .java (единицы компиляции), файла .class (файла класса) или // файла .jar (корневого фрагмента пакета) IJavaElement myJavaFile = JavaCore.create(myFile); }
Как только элемент Java получен, для обхода (дерева) модели и отправки запросов можно использовать API JDT. Можно также запрашивать ресурсы, отличные от Java, которые содержатся в элемента Java.
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) { ... // получение ресурсов, отличных от ресурсов Java, содержащихся в проекте. Object[] nonJavaChildren = myJavaProject.getNonJavaResources(); ...
При создании проекта Java из простого проекта класс JavaCore проверяет, настроен ли для этого проекта классификатор Java. Для того чтобы указать, что данный проект - это проект Java, модуль JDT использует классификатор. Этот классификатор (org.eclipse.jdt.core.JavaCore#NATURE_ID) присваивается проекту при его создании мастером создания проекта Java. Если для проекта не настроен классификатор Java, то при обращении к классу JavaCore для создания проекта будет возвращен null.
JavaCore используется также для поддержки пути к классам Java, в том числе расположений для поиска исходного кода и библиотек, и расположений для генерации выходных двоичных файлов (.class).
Каковы уникальные характеристики проектов Java? Они записывают свой путь к классам в файл ".classpath" и добавляют в спецификацию компоновки проекта дополняющий компоновщик проекта Java. В остальном они ничем не отличаются от обычных проектов и для них с помощью модулей можно указывать другие классификаторы (и другие дополняющие компоновщики). Для того чтобы добавить к другим классификаторам проекта классификатор Java (при добавлении в этот проект возможностей Java), в модуле настройки проекта используется класс NewJavaProjectWizardPage .
IJavaModel можно считать предком всех проектов в рабочей области, которые имеют классификатор Java (и, следовательно, могут рассматриваться как IJavaProject).