Mit der JDT-API kann ein Plug-in Klassen oder Schnittstellen erstellen, Methoden zu vorhandenen Typen hinzufügen oder die Methoden für Typen ändern.
Der einfachste Weg zur Änderung von Java-Objekten ist die Verwendung der API für Java-Elemente. Bei der Bearbeitung des unformatierten Quellcodes für ein Java-Element können allgemeinere Methoden verwendet werden.
Die einfachste Methode, eine Kompiliereinheit programmgestützt zu generieren, ist die Verwendung von IPackageFragment.createCompilationUnit. Sie geben den Namen und den Inhalt der Kompiliereinheit an. Die Kompiliereinheit wird im Paket erstellt, und das neue Objekt ICompilationUnit wird zurückgegeben.
Eine Kompiliereinheit kann generisch erstellt werden, indem im jeweiligen Ordner, der dem Paketverzeichnis entspricht, eine Dateiressource mit der Erweiterung .java erstellt wird. Die Verwendung der API für generische Ressourcen erfolgt wird von den Java-Tools nicht erkannt . Daher wird das Java-Modell erst dann aktualisiert, wenn die Listener-Funktionen für Änderungen generischer Ressourcen benachrichtigt werden und die JDT-Listener-Funktionen das Java-Modell mit der neuen Kompiliereinheit aktualisieren.
Die meisten einfachen Änderungen an Java-Quellen können über die API für Java-Elemente vorgenommen werden.
Beispielsweise können Sie einen Typ aus einer Kompiliereinheit abfragen. Sobald das Objekt IType vorhanden ist, können Sie dem Typ Quellcode-Member hinzufügen. Hierzu verwenden Sie eines der Protokolle createField, createInitializer, createMethod oder createType. In diesen Methoden werden der Quellcode und Informationen zur Position des Members zur Verfügung gestellt.
Die Schnittstelle ISourceManipulation definiert allgemeine Methoden zur Quellenbearbeitung für Java-Elemente. Hierzu gehören Methoden für das Umbenennen, Versetzen, Kopieren oder Löschen eines Typ-Members.
Einige Quellcodeänderungen sind über die API für Java-Elemente nicht möglich. Eine allgemeinere Methode zur Bearbeitung von Quellcode (z. B. das Ändern des Quellcodes für vorhandene Elemente) wird durch die Verwendung des unformatierten Quellcodes der Kompiliereinheit und des Java-Dokumentobjektmodells (Document Object Model - DOM) bereitgestellt.
Hierzu gehören die folgenden Techniken:
// Quelle für eine Kompiliereinheit abrufen
String contents = myCompilationUnit.getBuffer().getContents();
// JDOM erstellen, das bearbeitet werden kann.
myJDOM = new DOMFactory();
myDOMCompilationUnit = myJDOM.createCompilationUnit(contents, "MyClass");
// Mit dem JDOM-Knotenprotokoll in der Struktur der
// Kompiliereinheit navigieren und diese bearbeiten.
...
// Sobald Änderungen an allen Knoten vorgenommen wurden, die
// Quelle aus dem DOM-Knoten der Kompiliereinheit zurückerhalten.
String newContents = myDOMCompilationUnit.getContents();
// Diesen Code in das Element der Kompiliereinheit zurückstellen
myCompilationUnit.getBuffer().setContents(newContents);
// Den Puffer in der Datei speichern.
myCompilationUnit.save();
Bei dieser Methode werden unter Umständen Problemmarkierungen zu falschen Zeilennummern zugeordnet, da die Java-Elemente nicht direkt aktualisiert wurden.
Methoden und Felder sind die detailliertesten Ebenen des Java-Elementmodells. Die durch den Compiler verwendete Baumstruktur der abstrakten Syntax (Abstract Syntax Tree - AST) ist nicht als API verfügbar. Daher sind die durch JDT verwendeten Methoden, mit denen Quellen in programmatischen Strukturen syntaktisch analysiert werden, gegenwärtig nicht als API verfügbar.
Wenn Ihre Plug-ins Änderungen, die nach dem Fakt an Java-Elementen vorgenommen wurden, kennen müssen, können Sie ein Java-Objekt IElementChangedListener mit JavaCore registrieren.
JavaCore.addElementChangedListener(new MyJavaElementChangeReporter());.
Das Konzept der Listener-Funktionen für Änderungen an Java-Elementen ähnelt dem der Listener-Funktionen für Ressourcenänderungen, die unter Ressourcenänderungen protokollieren beschrieben sind. Der folgende Ausschnitt implementiert ein Berichtsprogramm für Änderungen an Java-Elementen, das die Element-Deltas an der Systemkonsole ausgibt.
public class MyJavaElementChangeReporter implements IElementChangedListener {
public void elementChanged(ElementChangedEvent event) {
IJavaElementDelta delta= event.getDelta();
if (delta != null) {
System.out.println("Delta empfangen: ");
System.out.print(delta);
}
}
)
Die Schnittstelle IJavaElementDelta umfasst das geänderte Element sowie Markierungen, die die Art der vorgenommenen Änderung beschreiben.