Anotasyon

Java – Özel Notasyon Oluşturmak

Merhaba arkadaşlar,
mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize Java Dersleri başlığı altındaki son yazımız olan Notasyonlar ile devam ediyoruz. Bildiğiniz üzere anotasyon kavramı Java 5 ile hayatımıza girdi.

Java 5 ile birlikte kullanılmaya başlayan notasyonlar; metoda, sınıfa veya değişkenlere özellik katmak için kullanılan yapılardır. Dilerseniz öncelikle Java’da zaten var olan notasyonların birkaçını hatırlayalım.

@Override notasyonu en sık kullanılanlardan olmakla beraber bildiğiniz üzere miras aldığınız bir sınıftaki netodu ezmek (yeniden yapılandırmak) için kullanılır. Bununla birlikte Abstract metod veya Interface’lerde bulunan gövdesiz metodları implemente ettiğimiz yerde override ederek kullanmaktayız.

@Deprecated notasyonu bir sınıfın, metodun veya değişkenin kullanımdan kalktığını ve artık kullanılmaması gerektiğini söyler. Herhangi bir yerde deprecated metod kullandığınız zaman derleyici uyarı vermektedir. Bu metodun kullanımı tavsiye edilmez diye. Deprecated olan herhangi bi metodu javadoc’da işaretlenmiş olarak görmeniz mümkün.

Yukarıda bulunan iki notasyon kullanımı java zaten var olan kullanımlardır ve bunlara ek olarak kendi özel notasyonlarımızı yazabiliriz. Notasyonların türlerine ve kullanım yerlerine göre nasıl yazılacağına bakalım.

Özel notasyonlarımızı @interface‘ı kullanarak oluşturuyoruz. OperationSystem adında bir notasyon oluşturduk ve burada bilmemiz gereken kısımların ayrıntılarını açıklayalım.

@Documented
@Inherited
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface OperationSystem {

    String name();

}

Özel notasyon oluştururken temelde bilmemiz gereken 4 alt başlık bulunmaktadır.

Document

Yukarıda oluşturmuş olduğumuz OperationSystem notasyonu sadece metodlarda kullanılabilir olduğu ElementType ile belirtilmiş ve kullanılan metodun JavaDoc’u oluşturulduğunda OperationSystem notasyonuda bu JavaDoc’da dahil edilmesi gerektiğini belirtiyoruz.

Target

Oluşturmuş olduğumuz notasyonu nerede kullanacağımızı belirtmek için kullanılırız. Yukarıdaki örnekte metod’da kullanacağımızı söylemiştik ve aşağıdaki gibi metodlar ile kullanımını göstermiş olduk.

@OperationSystem(name = "MacOS")
public void mac(String osName) {
    System.out.println("Welcome " + osName);
}

Reflection, sadece javaya özgü olmamakla birlikte birçok programlama dilinde çalışma zamanında bir metoda, sınıfa veya değişkene erişmemizi sağlayan jdk tarafından bize sağlanan bir API’dir. Aşağıda küçük bir senaryo ile reflection’ı nasıl kullanacağımızı görelim. Özel bir notasyon oluşturacağız ve bu notasyonun kullanıldığın metodları çağıracağız.

@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface OperationSystem {

}
public class AnnotationInvoker {

    public void mac() {
        System.out.println("Mac OS");
    }

    @OperationSystem
    public void linux() {
        System.out.println("Linux");
    }

    public void windows() {
        System.out.println("Windows");
    }

    @OperationSystem
    public void freedos() {
        System.out.println("Freedos");
    }

}

Yukarıda gördüğünüz üzere oluşturmuş olduğumuz özel notasyonu başka bir sınıfın bazı metodlarında kullandık ve şimdi gelin kullanmış olduğumuz metodları Reflection API yardımı ile çağıralım.

import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) {

        AnnotationInvoker runner = new AnnotationInvoker();
        Method[] methods = runner.getClass().getMethods();

        for (Method method : methods) {
            OperationSystem operationSystem = method.getAnnotation(OperationSystem.class);
            if (operationSystem != null) {
                try {
                    method.invoke(runner);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

Method[] methods = runner.getClass().getMethods(); yardımı ile ilgili sınıftaki tüm metodları çağırıyoruz ve içlerinden OperationSystem notasyonuna sahip olan metodları çağırıyoruz.

Main metodunu çalıştırdığımızda konsolda Freedos ve Linux yazısını göreceksiniz.

Bu yazıda sizlere Java’da özel notasyon nasıl oluşturulur ve oluşturmuş olduğumuz notasyonları reflection api ile nasıl kullanabiliriz bunları anlatmaya çalıştım aklınıza takılan bir kısım veya sormak istediğiinz bir şey olursa yorum yazmaktan çekinmeyin. Daha fazla ayrıntı için buradan yardım alabilirsiniz.

Hoşçakalın

4

Yusuf Çakal

Cumhuriyet Üniversitesi - Bilgisayar Mühendisliği (2014-2018)

Yorum Yaz

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?