插件可以使用 JDT API 来创建类或接口、将方法添加到现有类型中或者改变方法的类型。
改变 Java 对象最简单的方法就是使用 Java 元素 API。可以使用更常见的技术来处理 Java 元素的原始源代码。
使用程序生成编译单元最简单的方法是使用 IPackageFragment.createCompilationUnit。指定编译单元的名称和内容。将在包内创建编译单元, 并且将返回新的 ICompilationUnit。
通常,可以通过在对应包目录的相应文件夹中创建扩展名为“.java”的文件资源来按类别创建编译单元。使用类属资源 API 是在 Java 工具不知道的情况下进行的, 因此,在通知类属资源更改侦听器以及 JDT 侦听器使用新的编译单元更新 Java 模型之前,Java 模型不会更新。
大部分对 Java 源代码的简单修改可以使用 Java 元素 API 来完成。
例如,可以通过编译单元查询类型。一旦您具有 IType, 就可以使用诸如 createField、createInitializer、 createMethod 或 createType 之类的协议来将源代码成员添加到类型中。在这些方法中提供了源代码以及关于成员的位置的信息。
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 元素所作的更改, 则可以向 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 中包含更改的元素以及用来描述发生的更改种类的标志。