El modelo Java es el conjunto de clases que modelan los objetos asociados al proceso de crear, editar y construir un programa Java. Las clases del modelo Java están definidas en org.eclipse.jdt.core. Estas clases implementan comportamientos específicos de Java para los recursos y descomponen adicionalmente los recursos Java en elementos del modelo.
El paquete org.eclipse.jdt.core define las clases que modelan los elementos que componen un programa Java. Las herramientas de desarrollo Java (JDT) utilizan un modelo de objetos en memoria para representar la estructura de un programa Java. Esta estructura se deriva de la vía de acceso de clases del proyecto. El modelo es jerárquico. Los elementos de un programa pueden descomponerse en elementos hijo.
El proceso de manipular elementos Java es similar al de manipular objetos de recurso. Cuando trabaja con un elemento Java, en realidad está trabajando con un handle de un objeto de modelo subyacente. Para determinar si el elemento está realmente presente en el área de trabajo, debe utilizar el protocolo exists().
En la tabla siguiente figura un resumen de los distintos tipos de elementos Java.
Elemento | Descripción |
---|---|
IJavaModel | Representa el elemento Java raíz correspondiente al área de trabajo. Es el padre de todos los proyectos que tienen la naturaleza Java. También proporciona acceso a los proyectos que no tienen la naturaleza Java. |
IJavaProject | Representa un proyecto Java del área de trabajo. (Hijo de IJavaModel) |
IPackageFragmentRoot | Representa un conjunto de fragmentos de paquete y correlaciona los fragmentos con un recurso subyacente, que es una carpeta, un archivo JAR o un archivo ZIP. (Hijo de IJavaProject) |
IPackageFragment | Representa la parte del área de trabajo que corresponde a un paquete completo o a una parte del paquete. (Hijo de IPackageFragmentRoot) |
ICompilationUnit | Representa un archivo fuente Java (.java). (Hijo de IPackageFragment) |
IPackageDeclaration | Representa una declaración de paquete en una unidad de compilación. (Hijo de ICompilationUnit) |
IImportContainer | Representa la colección de declaraciones de importación de paquetes de una unidad de compilación. (Hijo de ICompilationUnit) |
IImportDeclaration | Representa una sola declaración de importación de paquete. (Hijo de IImportContainer) |
IType | Representa o bien un tipo fuente en una unidad de compilación o bien un tipo binario en un archivo de clase. |
IField | Representa un campo dentro de un tipo. (Hijo de IType) |
IMethod | Representa un método o un constructor dentro de un tipo. (Hijo de IType) |
IInitializer | Representa un inicializador estático o de instancia dentro de un tipo. (Hijo de IType) |
IClassFile | Representa un tipo compilado (binario). (Hijo de IPackageFragment) |
Todos los elementos Java dan soporte a la interfaz IJavaElement.
Algunos de los elementos aparecen en la vista Paquetes. Estos elementos implementan la interfaz IOpenable, porque para poder navegar por ellos, primero hay que abrirlos. La figura siguiente muestra cómo se representan estos elementos en la vista Paquetes.
Los elementos Java que implementan la interfaz IOpenable se crean básicamente a partir de la información existente en los archivos de recursos subyacentes. Esos mismos elementos se representan de manera genérica en la vista del navegador de recursos.
Otros elementos se corresponden con los elementos que componen una unidad de compilación Java. En la figura siguiente se muestra una unidad de compilación Java y un esquematizador de contenido que visualiza los elementos fuente de la unidad de compilación.
Estos elementos implementan la interfaz ISourceReference, porque pueden proporcionar el correspondiente código fuente. (A medida que vayan seleccionándose los elementos en el esquematizador de contenido, se irá mostrando su código fuente correspondiente en el editor Java).
Muchos de los elementos Java se corresponden con recursos genéricos del área de trabajo. La clase JavaCore será su mejor punto de partida cuando le interese crear elementos Java a partir de un recurso genérico. El fragmento de código siguiente muestra cómo obtener elementos Java a partir de sus recursos correspondientes.
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) { IJavaProject myJavaProject= JavaCore.create(myProject); if (myJavaProject == null) // el proyecto no está configurado para Java (no tiene naturaleza Java) return; // obtener un fragmento de paquete o el directorio raíz de un fragmento de paquete IJavaElement myPackageFragment= JavaCore.create(myFolder); // obtener un .java (unidad de compilación), .class (archivo de clase) o // .jar (directorio raíz de fragmento de paquete) IJavaElement myJavaFile = JavaCore.create(myFile); }
Cuando ya tenga un elemento Java, podrá utilizar la API de JDT para cruzar el modelo y hacer consultas. También podrá hacer consultas sobre los recursos no Java que haya en un elemento Java.
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) { ... // Obtener los recursos no Java que existan en mi proyecto. Object[] nonJavaChildren = myJavaProject.getNonJavaResources(); ...
Cuando crea un proyecto Java a partir de un proyecto simple, la clase JavaCore hará una comprobación para ver si el proyecto está configurado con la naturaleza Java. El conector JDT utiliza una naturaleza para designar que un proyecto tiene un comportamiento Java. Esta naturaleza (org.eclipse.jdt.core.JavaCore#NATURE_ID) se asigna a un proyecto cuando el asistente "Proyecto Java nuevo" crea un proyecto. Si un proyecto no tiene configurada la naturaleza Java, la clase JavaCore devolverá null cuando se le pida que cree el proyecto.
La clase JavaCore también se utiliza para mantener la vía de acceso de clases Java, incluidas las ubicaciones para localizar el código fuente y las bibliotecas, y las ubicaciones para generar archivos binarios de salida (.class).
¿Cuáles son las características exclusivas de los proyectos Java? Los proyectos Java registran sus vías de acceso de clases en un archivo ".classpath" y añaden el constructor incremental de proyectos Java a la especificación de construcción del proyecto. Aparte de esto, son tan solo proyectos normales y se pueden configurar con otras naturalezas (y con otros constructores incrementales) mediante conectores. Los conectores que tengan interés en configurar los proyectos con un comportamiento Java además del suyo propio suelen utilizar la clase NewJavaProjectWizardPage para asignar al proyecto la naturaleza Java, además de sus naturalezas o comportamientos personalizados propios.
La interfaz IJavaModel puede considerarse como padre de todos los proyectos del área de trabajo que tienen naturaleza de proyecto Java (y, por lo tanto, pueden tratarse como interfaz IJavaProject).