Eclipse Java Development Tools (JDT)

Merhabalar. Bu yazımızda Eclipse’in kendi içinde de kullandığı ve plugin geliştiricilere de sunduğu JDT teknolojisinden bahsedeceğiz. JDT sunduğu araçlarla bir Java programını modelleyerek içeriğini okumayı veya üzerinde düzenlemeler yapmayı mümkün kılıyor. Biz de geliştirdiğimiz model diagram pluginlerinde ürettiğimiz kod ile model senkronizasyonunu sağlayabilmek için bu teknolojiden faydalanıyoruz.

JDT kullanmak istediğiniz plugin projelerinde plugin.xml > Dependencies bölümüne “org.eclipse.jdt.core” isimli plugini eklemeniz gerekmektedir.

Java Model

Bir Java projesini meyana getiren elementleri aklımıza getirelim. Paketler, sınıflar, sınıfların içerisine girdiğimizde, metodlar, sınıf değişkenleri (attributes, fields), anotasyonlar… JDT tüm bunlar için bize hiyerarşik bir yapı sunmaktadır.

openable Java elements (jdt)
Element Açıklama
IJavaModel Workspace’e karşılık gelen root Java elementidir. Workspace’deki tüm projelere erişim sağlayabilirsiniz.
IJavaProject Workspace’de bulunan bir Java projesi. (Child of IJavaModel)
IPackageFragmentRoot Bir klasörde, JAR veya ZIP dosyasında bulunan bir grup paketi temsil etmektedir. (Child of IJavaProject)
IPackageFragment Projedeki bir paket. (Child of IPackageFragmentRoot )
ICompilationUnit Java kaynak kodu dosyasını (.java) temsil etmektedir. (Child of IPackageFragment )
IPackageDeclaration Java dosyamızda bulunan paket tanımı. (Child of ICompilationUnit )
IImportContainer Import tanımlarını tutan konteynır. (Child of ICompilationUnit )
IImportDeclaration Tek bir import tanımı. (Child of IImportContainer )
IType Java sınıf tipidir. Kaynak koddan gelen veya binary class dosyalarından gelen olmak üzere iki çeşidi vardır.
IField Sınıf değişkenidir (field, attribute). (Child of IType )
IMethod Java tipinde tanımlı bir metod. (Child of IType )
IInitializer Static veya instance initializer. (Child of IType )
IClassFile Derlenmiş binary bir class dosyasını (.class) temsil etmektedir. (Child of IPackageFragment )
ITypeParameter Type parameter’ı temsil etmektedir. (Herhangi bir Java elementin çocuğu değildir. IType.getTypeParameter(String) veya IMethod.getTypeParameter(String) metodlarıyla elde edilir.)
ILocalVariable Bir metodda veya initializer’da bulunan yerel bir değişkendir. (Herhangi bir Java element’in çocuğu değildir. ICodeAssist.codeSelect(int, int) metodu ile elde edilir.)
IAnnotation Java 5 anotasyonu. (Herhangi bir Java element’in çocuğu değildir. IAnnotatable.getAnnotation(String) veya IAnnotatable.getAnnotations() metodlarıyla elde edilir.)
IAnnotatable Annotasyonlanabilecek elementleri temsil etmektedir. Bu bir type, field, method, local variable veya bir package declaration olabilir.

Source elements (jdt)

Örnek Kod

Bu yapıları elde etmek için Eclipse’in resource nesneleri kullanılmaktadır. Mesela bir java dosyasını IFile objesi olarak ele aldığımızda aşağıdaki kodlar ile JDT araçlarını kullanabiliriz

// Workspace'e ulaşacağımız nesne
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
//Workspace'de bulunan tüm projeler
IProject[] projects = root.getProjects();
//İçinde SampleClass.java dosyası oluşturduğumuz bir projeyi seçiyoruz.
Iproject project = projects§ff8fcb748aafb4ac9ff9ce9cd085d3e1§;
IFile javaFile = project.getFile("SampleClass.java");
IJavaElement cu  = JavaCore.create(javaFile);
ICompilationUnit compilationUnit = (ICompilationUnit) cu;
IType type = compilationUnit.getType("SampleClass");

Bu sınıfta tanımlanmış fieldları ve metodları aşağıdaki kod ile elde edebiliriz. .getSource() metodu ile de kaynak kodunu elde edebiliriz.

IMethod[] methods = type.getMethods();
IField[] fields = type.getFields();
String sourceCode = methods§20acb675f863e0fa6131859626676ca7§.getSource();

Bu sınıf elemanlarının modifier’larını (public, private, static, final, vs.), kendilerinden elde ettiğimiz flags değerini kullanarak tek tek Modifier sınıfında tanımlanan metodlar ile kontrol etmemiz gerekmektedir. Mesela bir field’ın static, final olup olmadığını aşağıdaki kod ile öğrenebiliriz.

int flags = iField.getFlags();
boolean isStatic = Modifier.isStatic(flags);
boolean isFinal = Modifier.isFinal(flags);

Kod Düzenleme

Şimdi de JDT kullanarak yeni bir paket ve bu paketin içinde yeni bir java dosyası oluşturan kodu görelim.

// iProject bir IProject nesnesidir.
IJavaProject projectModel = JavaCore.create(iProject);

IFolder folder = resource.getFolder("/src/main/java");

try {

IPackageFragmentRoot srcFolder = projectModel.getPackageFragmentRoot(folder);

IPackageFragment fragment = srcFolder.createPackageFragment("yenipaket", true, null);

//init code string and create compilation unit
String str = "package yenipaket;" + "\n"
+ "public class TestDeneme  {" + "\n" + " private String name;" + "\n" + "}";
ICompilationUnit compilationUnit = fragment.createCompilationUnit("TestDeneme.java",str, true, null);
IType testDenemeType = compilationUnit.getType("TestDeneme");

// Bir field tanımlıyoruz.
testDenemeType.createField("private String age;", null, true, null);

IField[] fields = testDenemeType.getFields();
for (IField iField : fields) {
System.out.println( "field: " + iField.getElementName() + " typeSig:" + iField.getTypeSignature() );
}

} catch (JavaModelException e1) {
throw new RuntimeException(e1);
}

JDT ile yapabileceklerini bununla sınırlı değil. Bu teknoloji ile ;

  • Bir java projesini düzenleyebilir veya derleyebilirsiniz (JDT Core)
  • Test veya debug edebilirsiniz (JDT Debug)
  • IDE’nin user interface desteğini kullanabilirsiniz (JDT UI)