Java 模型

Java 模型是用来对与创建、编辑和构建 Java 程序相关联的对象进行建模的一些类。Java 模型类是在 org.eclipse.jdt.core 中定义的。这些类实现资源的特定于 Java 的行为,并进一步将 Java 资源分解成模型元素。

Java 元素

org.eclipse.jdt.core 定义了用来对组成 Java 程序的元素建模的一些类。JDT 使用内存中的对象模型来表示 Java 程序的结构。此结构是从项目的类路径派生的。模型是分层的。可以将程序的元素分解成子元素。

处理 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 接口的元素的“包视图”

实现 IOpenable 的 Java 元素基本上是根据在底层资源文件中找到的信息创建的。相同的元素是在资源导航器视图中按类别表示的。  

显示实现 IOpenable 接口的元素的“资源导航器”

其它元素对应于组成 Java 编译单元的项。下图显示 Java 编译单元和内容大纲窗口(它显示编译单元中的源元素)。

说明相应源元素之间的关系的编辑器和内容大纲窗口

因为这些元素可以提供相应的源代码,所以它们实现了 ISourceReference 接口。(当在内容大纲窗口中选择了这些元素时,就会在 Java 编辑器中显示它们相应的源代码)。

Java 元素及其资源

许多 Java 元素对应于工作空间中的通用资源。当您想根据通用资源来创建 Java 元素时,最好是从类 JavaCore 开始。以下代码段说明如何从 Java 元素的相应资源中获取 Java 元素。

    
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
      IJavaProject myJavaProject = JavaCore.create(myProject);
      if (myJavaProject == null)
         // the project is not configured for Java (has no Java nature)
            return;
            
      // get a package fragment or package fragment root
      IJavaElement myPackageFragment = JavaCore.create(myFolder);
        
      // get a .java (compilation unit), .class (class file), or
      // .jar (package fragment root)
      IJavaElement myJavaFile = JavaCore.create(myFile);
    }

一旦有了 Java 元素,就可以使用 JDT API 来遍历和查询模型。还可以查询包含在 Java 元素内的非 Java 资源。   

         private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        ...
        // get the non Java resources contained in my project.
        Object[] nonJavaChildren = myJavaProject.getNonJavaResources();
        ...
            

Java 项目

当根据简单项目来创建 Java 项目时,JavaCore 将检查项目是否是用 Java 性质来配置的。JDT 插件使用项目性质来将项目指定为具有 Java 行为。当“新建 Java 项目”向导创建项目时,将为项目指定此性质(org.eclipse.jdt.core.JavaCore#NATURE_ID)。如果未对项目配置 Java 性质,则在要求创建项目时,JavaCore 将返回 null。

JavaCore 还用来维护 Java 类路径,包括用于查找源代码和库的位置以及用于生成输出二进制(.class)文件的位置。

什么是 Java 项目的唯一特征?Java 项目将它们的类路径记录在“.classpath”文件中,并将 Java 增量项目构建器添加到项目的构建规范中。否则,它们只是常规项目,并且可以由插件利用其它性质(和其它增量构建器)来配置。对于那些想要利用除了它们自己的行为之外的 Java 行为来配置项目的插件,它们通常使用 NewJavaProjectWizardPage 来为项目指定除了它们自己的定制性质或行为之外的 Java 性质。

IJavaModel 可以认为是工作空间中具有 Java 项目性质的所有项目的父代(因此,可以当作 IJavaProject)。