处理 Java 代码

插件可以使用 JDT API 来创建类或接口、将方法添加到现有类型中或者改变方法的类型。

改变 Java 对象最简单的方法就是使用 Java 元素 API。可以使用更常见的技术来处理 Java 元素的原始源代码。

使用 Java 元素来修改代码

生成编译单元

使用程序生成编译单元最简单的方法是使用 IPackageFragment.createCompilationUnit。指定编译单元的名称和内容。将在包内创建编译单元, 并且将返回新的 ICompilationUnit

通常,可以通过在对应包目录的相应文件夹中创建扩展名为“.java”的文件资源来按类别创建编译单元。使用类属资源 API 是在 Java 工具不知道的情况下进行的, 因此,在通知类属资源更改侦听器以及 JDT 侦听器使用新的编译单元更新 Java 模型之前,Java 模型不会更新。

修改编译单元

大部分对 Java 源代码的简单修改可以使用 Java 元素 API 来完成。

例如,可以通过编译单元查询类型。一旦您具有 IType, 就可以使用诸如 createFieldcreateInitializercreateMethodcreateType 之类的协议来将源代码成员添加到类型中。在这些方法中提供了源代码以及关于成员的位置的信息。

ISourceManipulation 接口定义 Java 元素的常见源代码处理。这包括用于重命名、移动、复制或删除类型的成员的方法。

类属源代码修改

某些源代码修改不是通过 Java 元素 API 来提供的。编辑源代码(例如,更改现有元素的源代码)的较常见方法是使用编译单元的原始源代码和 Java DOM 来完成的。

这些技术包括下列各项:

// 获取编译单元的源代码
String contents = myCompilationUnit.getBuffer().getContents();

// 创建可编辑 JDOM
myJDOM = new DOMFactory();
myDOMCompilationUnit = myJDOM.createCompilationUnit(contents, "MyClass");

// 使用 JDOM 节点协议来浏览和编辑编译
// 单元结构。
...
// 一旦对所有节点作出了修改,
// 就会从编译单元 DOM 节点取回源代码。
String newContents = myDOMCompilationUnit.getContents();

// 将此代码设置为编译单元元素
myCompilationUnit.getBuffer().setContents(newContents);

// 将缓冲区保存至文件。
myCompilationUnit.save();

此技术可能会导致问题标记与不正确的行号相关联,原因是未直接更新 Java 元素。

Java 元素模型同方法和字段差不多。编译器所使用的抽象语法树(AST)并不象 API 一样的可用,因此,JDT 用来将源代码分析成程序化结构的技术当前也不能象 API 一样的可用。

对 Java 元素中的更改的响应

如果事后插件需要知道对 Java 元素所作的更改, 则可以向 JavaCore 注册 Java IElementChangedListener

JavaCore.addElementChangedListener(new MyJavaElementChangeReporter());.

Java 元素更改侦听器在概念上类似于资源更改侦听器 (在跟踪资源更改中进行了描述)。下列代码片段实现 Java 元素更改指示器,它将元素变化打印到系统控制台中。

public class MyJavaElementChangeReporter implements IElementChangedListener {
    public void elementChanged(ElementChangedEvent event) {
        IJavaElementDelta delta= event.getDelta();
        if (delta != null) {
            System.out.println("delta received: ");
            System.out.print(delta);
        }
    }
)

IJavaElementDelta 中包含更改的元素以及用来描述发生的更改种类的标志。