Java Custom Annotation

Java Custom Annotation

1286 Görüntülenme
0
0

Merhaba değerli Java dostları,

Bu yazımızda çok kullanılan ve her yeni API, framework ile beraber daha da çok kullanılmaya başlanılan annotationlardan bahsetmek istiyorum. Annotationlar bizim için bir metadata, önbilgi gibi çalışmaktadır. Yani değişken, metot veya sınıf hakkında bazı ön bilgileri içerirler. Direkt olarak çalışma mantıkları üzerinde etkisi yoktur. Bu ön bilgiler çalışma anında kullanılabileceği gibi, compile anında ve öncesinde de kullanılabilir.

Aşağıda en çok karşılaşılan bazı annotation örneklerini vermek istiyorum.

@Override, @SuppressWarnings, @Test gibi…

Biraz daha iyi anlaşılabilmesi için @Override annotationu açıklamak istiyorum. Interface implemente eden veya abstract sınıf extends bir sınıf buradaki metotları override etmek zorundadır. Zorunlu olmamakla beraber bu metotların başına @Override eklenir. Böylece compiler için bir ön bilgi verilmiş olunur. Verilen @Override metodun çalışmasına, mantığına hiçbir şekilde etki etmemektedir. Annotation kullanımı kolaylık sağlamakla beraber bazı götürüleri de beraberinde getiriyor. Örnek verecek olursak bazı değerlerin takibi için sınıfların içerisine girip annotation değerlerini kontrol etmek gerekir. 

Örnek kodlarımıza geçelim.

package anajavatica.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnnotation {
public String IDE();
}

Burada özel bir @interface anahtarı ile bunun bir annotation olduğunuz vurguluyoruz. Gövde arasında kalan bölüm ise klasik bir interface tanımından başka bir şey değil; fakat farklılık @Target ve @Retention kısmında oluşmaktadır. @Target belirtimi ile bu annotation için hedef yazılım öğesini belirtiyoruz. 

Alabileceği değerler;

•    ElementType.ANNOTATION_TYPE
•    ElementType.CONSTRUCTOR
•    ElementType.FIELD
•    ElementType.LOCAL_VARIABLE
•    ElementType.METHOD
•    ElementType.PACKAGE
•    ElementType.PARAMETER
•    ElementType.TYPE

Her değerin kendine göre farklı bir kullanım alanı vardır. Biz ElementType.TYPE kullanarak bunun sınıf bazında olduğunu belirtiyoruz.
@Retention ise tanımlanan annotationın nasıl yorumlanacağını ve saklanacağını belirtir. 

Bunun için ise kullanılabilecek değerler;

•    RetentionPolicy.SOURCE
•    RetentionPolicy.CLASS
•    RetentionPolicy.RUNTIME

Source, olarak işaretlenen annotation kaynak kod anlamında yorumlanır ve JVM tarafından göz ardı edilir. Class ise compile anında compiler tarafından dikkate alınır; ama yine JVM tarafından göz ardı edilir. Dolayısıyla çalışma anında erişilemez. Son olarak Runtime ile JVM tarafından da yorumlanır ve çalışma anında erişilebilir durumdadır.

Şimdi ise method bazında bir annotation tanımlayalım.

package anajavatica.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {
public String author();
public int rate();
}

Şimdi de bu custom annotationları kullanan bir sınıfımız olsun.

package anajavatica.annotation;@ClassAnnotation(IDE = “Eclipse”)
public class CustomAnn {
@MethodAnnotation(author = “Author1”, rate = 50)
public CustomAnn method1() {
System.out.println(“method1”);
return this;
}
@MethodAnnotation(author = “Author2”, rate = 75)
public CustomAnn method2() {
System.out.println(“method2”);
return this;
}
}

Son olarak bu annotationlara ulaşmak ve işlemek için bir main metodunu içeren sınıfımız.

package anajavatica.annotation;

import java.lang.reflect.Method;
public class AnnotationMain {
public static void main(String[] args) {
ClassAnnotation[] caList = CustomAnn.class.getAnnotationsByType(ClassAnnotation.class);
for (ClassAnnotation ca : caList)
System.out.println(ca.IDE());
for (Method method : CustomAnn.class.getDeclaredMethods()) {
MethodAnnotation[] maList = method.getAnnotationsByType(MethodAnnotation.class);
for (MethodAnnotation ma : maList)
System.out.println(ma.author() + ” – ” + ma.rate());
}
}
}

Annotationlar gün geçtikçe daha çok kullanılmaktadır. Pratik oldukları için oldukça kullanışlı bir yapı sunuyorlar. Siz de kendi kütüphanelerinizi yazarken bu şekilde annotation tanımları yaparak son kullanıcıya pratiklik sağlayabilirsiniz. 

Bol Java’ lı günler dileğiyle…  

Yazan: Faruk BOZAN
 

Yorum Yap

Kategoriler