プラグインは JDT API を使用して、クラスまたはインターフェースを作成したり、既存の型にメソッドを追加したり、 あるいは型のメソッドを変更したりすることができます。
Java オブジェクトを最も簡単に変更するには、Java エレメント API を使用します。 生の Java エレメントのソース・コード自体を操作する場合は、さらに一般的な手法を使用できます。
プログラムでコンパイル単位を生成する最も簡単な方法は、 IPackageFragment.createCompilationUnit を使用することです。コンパイル単位の名前と内容を指定します。 コンパイル単位はパッケージ内に作成され、 新規の ICompilationUnit が戻されます。
パッケージ・ディレクトリーに対応する該当フォルダーに ".java" という拡張子を持つファイル・リソースを作成することにより、 コンパイル単位を包括的に作成することができます。 汎用リソース API は Java ツールの「背後で」使用されるため、 汎用リソース変更リスナーが通知を受け、JDT リスナーが新規のコンパイル単位で Java モデルを更新したときにはじめて Java モデルが更新されます。
Java エレメント API を使用すると、Java ソースを最も簡単に変更することができます。
たとえば、コンパイル単位から型を照会することができます。 IType があれば、 createField、createInitializer、createMethod、 または createType などのプロトコルを使用して、その型にソース・コード・メンバーを追加することができます。 ソース・コードおよびメンバーのロケーションに関する情報は、これらのメソッドで提供されます。
ISourceManipulation インターフェースは、 Java エレメントに対する共通のソース操作を定義しています。 これには、型のメンバーの名前変更、移動、コピー、または削除が含まれます。
Java エレメント API からでは行えないソース・コード変更もあります。 ソース・コードをより一般的な方法 (たとえば、既存のエレメントのソース・コードを変更する) で編集するには、 コンパイル単位の生のソース・コードと Java DOM を使用します。
これらの手法には、以下のものがあります。
// get the source for a compilation unit
String contents = myCompilationUnit.getBuffer().getContents();
// Create an editable JDOM
myJDOM = new DOMFactory();
myDOMCompilationUnit = myJDOM.createCompilationUnit(contents, "MyClass");
// Navigate and edit the compilation unit structure using
// JDOM node protocol.
...
// Once modififications have been made to all of the nodes
// get the source back from the compilation unit DOM node.
String newContents = myDOMCompilationUnit.getContents();
// Set this code back into the compilation unit element
myCompilationUnit.getBuffer().setContents(newContents);
// Save the buffer to the file.
myCompilationUnit.save();
Java エレメントは直接更新されないため、 この手法を使用すると問題マーカーが誤った行番号に関連付けられる可能性があります。
Java エレメント・モデルは、メソッドおよびフィールド以上に細分化はされません。 コンパイラーが使用する抽象構文ツリー (AST) は API として使用することができないため、 ソースをプログラム構造に展開して解析するために JDT が使用する手法は、現在、API として使用することはできません。
Java エレメントに変更が加えられた後に、プラグインにそれを認識させる必要がある場合には、 Java の IElementChangedListener を JavaCore に登録することができます。
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 には、 変更されたエレメント、および発生した変更の種類を表すフラグが含まれています。