Votre plug-in peut utiliser l'API JDT pour créer des classes ou des interfaces, ajouter des méthodes aux types existants ou modifier les méthodes qu'ils comportent déjà.
Le moyen le plus simple de modifier un objet Java est d'utiliser l'API de l'élément Java correspondant. Des techniques plus générales peuvent être utilisées pour travailler sur le code source brut d'un élément Java.
Le moyen le plus simple de générer programmatiquement une unité de compilation est d'utiliser IPackageFragment.createCompilationUnit. Vous spécifiez le nom et le contenu de l'unité de compilation. Cette dernière sera créée à l'intérieur du package et le nouvel élément ICompilationUnit sera renvoyé.
Vous pouvez créer une unité de compilation de manière générique en créant une ressource fichier dont l'extension est ".java" dans le dossier approprié qui correspond au répertoire du package. JDT n'a pas connaissance de l'utilisation de la ressource générique, si bien que le modèle Java n'est pas mis à jour tant que les listeners (ou "écouteurs") d'événements de modification ne reçoivent pas de notification et que les listeners de JDT mettent à jour le modèle Java avec la nouvelle unité de compilation.
Les modifications de code source Java les plus simples peuvent être réalisées à l'aide de l'API de l'élément Java.
Par exemple, vous pouvez demander un type à une unité de compilation. Une fois en possession du IType, vous pouvez utiliser un protocole tel que createField, createInitializer, createMethod ou createType pour ajouter des membres de code source au type. Le code source et les informations sur l'emplacement du membre sont fournis dans ces méthodes.
L'interface ISourceManipulation définit des manipulations de code source courantes pour les éléments Java. Elle comprend des méthodes permettant de renommer, de déplacer, de copier ou de supprimer un membre de type.
Certaines modifications de code source ne sont pas réalisables via l'API de l'élément Java. Il existe des techniques d'édition plus générales (par exemple, pour modifier le code source d'éléments existants) qui consistent à utiliser le code source brut et le DOM Java de l'unité de compilation.
Parmi ces techniques figure la suivante :
// obtenir la source d'une unité de compilation
String contents = myCompilationUnit.getBuffer().getContents();
// Créer un JDOM éditable
myJDOM = new DOMFactory();
myDOMCompilationUnit = myJDOM.createCompilationUnit(contents, "MyClass");
// Naviguer dans et éditer la structure de l'unité de compilation à l'aide du
// protocole de noeud JDOM.
...
// Une fois les modifications apportées à tous les noeuds,
// récupérer la source à partir du noeud DOM de l'unité de compilation.
String newContents = myDOMCompilationUnit.getContents();
// Remettre ce code en place dans l'élément de l'unité de compilation
myCompilationUnit.getBuffer().setContents(newContents);
// Sauvegarder le tampon dans le fichier.
myCompilationUnit.save();
Avec cette technique, il est possible que les marqueurs de problèmes soient associés à des numéros de ligne incorrects, puisque les éléments Java n'ont pas été mis à jour directement.
Le modèle consistant à modifier l'élément Java ne permet pas d'accéder à un niveau plus bas que celui des méthodes et des champs. L'arbre de syntaxe abstraite (AST) utilisé par le compilateur n'est pas disponible en tant qu'API. Par conséquent, les techniques utilisées par JDT pour décomposer la source en structures programmatiques ne sont pas actuellement disponibles sous forme d'API.
Si votre plug-in doit avoir connaissance des modifications apportées aux éléments Java une fois que celles-ci ont eu lieu, vous pouvez enregistrer un IElementChangedListener avec JavaCore.
JavaCore.addElementChangedListener(new MyJavaElementChangeReporter());.
D'un point de vue conceptuel, les listeners de modifications d'éléments Java sont similaires aux listeners de modifications de ressources (décrits dans la section Suivi des modifications de ressources). Le fragment de code suivant implémente un "rapporteur" de modification d'élément Java qui imprime les deltas de l'élément sur la console système.
public class MyJavaElementChangeReporter implements IElementChangedListener {
public void elementChanged(ElementChangedEvent event) {
IJavaElementDelta delta= event.getDelta();
if (delta != null) {
System.out.println("delta reçus : ");
System.out.print(delta);
}
}
)
L'objet IJavaElementDelta inclut l'élément qui a été modifié ainsi que des fanions décrivant le type de modification qu'il a subi.