Model Java

Model Java to zestaw klas, które modelują obiekty powiązane z tworzeniem, edytowaniem i budowaniem programu Java. Klasy modelu Java są zdefiniowane w pakiecie org.eclipse.jdt.core. Te klasy implementują specyficzne zachowanie Java dla zasobów i głębiej dekomponują zasoby Java na elementy modelu.

Elementy Java

Pakiet org.eclipse.jdt.core definiuje klasy modelujące elementy, z których składa się program Java. Środowisko JDT korzysta z modelu obiektów w pamięci, który reprezentuje strukturę programu Java. Ta struktura pochodzi ze ścieżki klasy projektu. Model jest hierarchiczny. Elementy programu mogą być dekomponowane na elementy potomne.

Manipulowanie elementami Java przypomina manipulowanie obiektami zasobów.  Podczas pracy z elementem Java w rzeczywistości pracuje się z uchwytem do bazowego obiektu modelu.  Aby określić, czy element jest rzeczywiście obecny w obszarze roboczym, należy użyć protokołu exists()

W poniższej tabeli znajduje się podsumowanie różnych typów elementów Java.

Element Opis
IJavaModel Reprezentuje główny element Java odpowiadający obszarowi roboczemu. Element nadrzędny wszystkich projektów natury Java. Umożliwia również dostęp do projektów niemających natury Java.
IJavaProject Reprezentuje projekt Java w obszarze roboczym. Element potomny interfejsu IJavaModel.
IPackageFragmentRoot Reprezentuje zestaw fragmentów pakietów i odwzorowuje te fragmenty na bazowy zasób, który jest folderem, plikiem JAR lub ZIP. Element potomny interfejsu IJavaProject.
IPackageFragment Reprezentuje fragment obszaru roboczego odpowiadający całemu pakietowi lub fragmentowi pakietu. Element potomny interfejsu IPackageFragmentRoot.
ICompilationUnit Reprezentuje plik źródłowy Java (.java). Element potomny interfejsu IPackageFragment.
IPackageDeclaration Reprezentuje deklarację pakietu w jednostce kompilacji. Element potomny interfejsu ICompilationUnit.
IImportContainer Reprezentuje kolekcję deklaracji importu pakietów w jednostce kompilacji. Element potomny interfejsu ICompilationUnit.
IImportDeclaration Reprezentuje pojedynczą deklarację importu pakietu. Element potomny interfejsu IImportContainer.
IType Reprezentuje typ źródłowy wewnątrz jednostki kompilacji lub typ binarny wewnątrz pliku CLASS.
IField Reprezentuje pole wewnątrz typu. Element potomny interfejsu IType.
IMethod Reprezentuje metodę lub konstruktor wewnątrz typu. Element potomny interfejsu IType.
IInitializer Reprezentuje inicjator static lub inicjator instancji wewnątrz typu. Element potomny interfejsu IType.
IClassFile Reprezentuje skompilowany (binarny) typ.  Element potomny interfejsu IPackageFragment.

Wszystkie elementy Java obsługują interfejs IJavaElement.

Niektóre elementy są widoczne w widoku Pakiety.  Te elementy implementują interfejs IOpenable , ponieważ muszą one zostać otwarte, zanim można będzie nawigować między nimi. Poniższy rysunek pokazuje sposób wyświetlania tych elementów w widoku Pakiety.

Widok Pakiety pokazujący elementy implementujące interfejs IOpenable

Elementy Java, które implementują interfejs IOpenable, są tworzone głównie na podstawie informacji znajdujących się w bazowych plikach zasobów.  Te same elementy są reprezentowane w widoku nawigatora zasobów.

Nawigator zasobów zawierający elementy implementujące interfejs IOpenable

Inne elementy odpowiadają elementom tworzącym jednostkę kompilacji Java. Na poniższym rysunku prezentowana jest jednostka kompilacji Java i schemat treści, który zawiera elementy źródłowe w jednostce kompilacji.

Edytor i schemat treści prezentujące relację między odpowiadającymi sobie elementami źródłowymi

Te elementy implementują interfejs ISourceReference, ponieważ mogą one dostarczać odpowiedni kod źródłowy. Gdy elementy te są wybrane w schemacie treści, odpowiadający im kod źródłowy jest pokazywany w edytorze Java.

Elementy Java i ich zasoby

Wiele elementów Java odpowiada ogólnym zasobom w obszarze roboczym.  Klasa JavaCore jest najlepszym punktem startowym tworzenie nowych elementów Java na podstawie zasobu ogólnego. Poniższy fragment kodu ilustruje sposób pobierania elementów Java z odpowiadających im zasobów.

    
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        IJavaProject myJavaProject= JavaCore.create(myProject);
        if (myJavaProject == null)
            // projekt nie został skonfigurowany dla języka Java (nie ma natury Java)
            return;
            
        // pobierz fragment pakietu lub element główny fragmentu pakietu         IJavaElement myPackageFragment= JavaCore.create(myFolder);
        
        // pobranie pliku .java (jednostka kompilacji), .class (plik klasy)
        // lub .jar (element główny fragmentu pakietu)
        IJavaElement myJavaFile = JavaCore.create(myFile);
    }

Po pobraniu elementu Java można za pomocą interfejsu API środowiska JDT nawigować po modelu i tworzyć zapytania dotyczące tego modelu.  Można również tworzyć zapytania dotyczące zasobów innych niż Java zawartych w elemencie Java. 

         private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        ...
        // pobranie zasobów innych niż Java znajdujących się w projekcie
        Object[] nonJavaChildren = myJavaProject.getNonJavaResources();
        ...
            

Projekty Java

Podczas tworzenia projektu Java na podstawie prostego projektu klasa JavaCore sprawdza, czy projekt ma skonfigurowaną naturę Java.  Moduł dodatkowy JDT używa natury do oznaczania projektu jako projektu Java.  Ta natura (org.eclipse.jdt.core.JavaCore#NATURE_ID) jest przypisywana projektowi podczas jego tworzenia za pomocą kreatora Nowy projekt Java.  Jeśli dla projektu nie została skonfigurowana natura Java, klasa JavaCore zwróci wartość NULL w odpowiedzi na żądanie utworzenia projektu.

Klasa JavaCore jest również używana do obsługi ścieżki klasy Java, w tym miejsc zawierających kod źródłowy i biblioteki oraz miejsc, w których umieszczane są wyjściowe pliki binarne (.class).

Jakie są unikalne parametry projektów Java? Zapisują one swoją ścieżkę klasy w pliku .classpath i dodają przyrostowy program budujący projekt Java do specyfikacji budowania projektu.  Poza tym są one po prostu normalnymi projektami i mogą być konfigurowane z innymi naturami (i innymi przyrostowymi programami budującymi) przez moduły dodatkowe. Moduły dodatkowe, które oprócz własnych funkcji mają konfigurować w projektach zachowania specyficzne dla języka Java zwykle korzystają z klasy NewJavaProjectWizardPage do przypisania projektowi natury Java jako dodatku do ich własnych niestandardowych natur i zachowań.

Interfejs IJavaModel może być uważany za element nadrzędny wszystkich projektów, które mają naturę Java (i mogą być traktowane jako implementacje interfejsu IJavaProject).