Модель Java

Модель Java представляет собой набор классов, моделирующих объекты, связанные с созданием, изменением и компоновкой программы на Java. Классы модели Java определяются в пакете org.eclipse.jdt.core.  Эти классы реализуют элементы Java для соответствующих ресурсов и затем представляют ресурсы 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 , поскольку для того чтобы по ним можно было перемещаться, они должны быть предварительно открыты. На следующем рисунке показано, как эти элементы представляются в панели Пакеты.

Панель Пакеты с элементами, реализующими интерфейс IOpenable

Элементы Java, реализующие интерфейс IOpenable , создаются главным образом из информации, найденной в соответствующих им файлах ресурсов.  Те же самые элементы в общем представлены в панели Навигатор ресурсов.

Навигатор ресурсов с элементами, реализующими интерфейс IOpenable

Другие элементы соответствуют элементам, из которых состоит единица компиляции Java. На приведенном ниже рисунке показана единица компиляции Java и группировщик содержимого, отображающий элементы исходного кода в единице компиляции.

редактор и схема содержимого со связями между элементами исходного кода

Эти элементы реализуют интерфейс ISourceReference, поскольку они могут предоставлять соответствующий исходный код. (При выборе этих элементов в группировщике содержимого соответствующий им исходный код отображается в редакторе Java).

Элементы 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

При создании проекта 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).