Ek açıklamalar oluşturmak, bazı kurallarla sınırlandırılsa da oldukça basit bir işlemdir. Şimdi hangi pratik amaca hizmet ettiklerini bulmamız gerekiyor.

Kendi ek açıklamamızı nasıl oluşturduğumuzu hatırlayalım.

Sınıflar ve yöntemler için olan ve kodun yazarı ve sürümü hakkında bilgi içeren bir ek açıklama yazacağız:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

İşte açıklamalı olarak eklediğimiz sınıflarımız:

@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}

@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}

@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}

Bu verileri çalışma zamanında nasıl kullanabiliriz?

Ek açıklamalardan meta verileri ayıklamak için yansımayı kullanarak. Yansımanın ne olduğunu hatırlayın. Yansıma, çalışma zamanında bir program hakkındaki verileri incelemek için bir mekanizmadır. Yansıma, alanlar, yöntemler, sınıf kurucuları ve sınıflar hakkında bilgi almanızı sağlar.

Bir sınıftaki ek açıklamaları okumak ve istediğimiz bilgileri görüntülemek için yansımayı kullanacağız.

Ana yöntemde sınıflarımızdan verileri okuyacağız :

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;

public class Main {
   public static void main(String[] args) throws NoSuchMethodException {
       readMyClass(MyClass1.class);
       readMyClass(MyClass2.class);
       readMyClass(MyClass3.class);
   }

   static void readMyClass(Class<?> myClassObj) throws NoSuchMethodException {
       System.out.println("\nClass: " + myClassObj.getName());
       readAnnotation(myClassObj);
       Method method = myClassObj.getMethod("myClassMethod");
       readAnnotation(method);
   }

   static void readAnnotation(AnnotatedElement element) {
       try {
           System.out.println("Search for annotations in " + element.getClass().getName());
           Annotation[] annotations = element.getAnnotations();
           for (Annotation annotation : annotations) {
               if (annotation instanceof Info) {
                   final Info fileInfo = (Info) annotation;
                   System.out.println("Author: " + fileInfo.author());
                   System.out.println("Version: " + fileInfo.version());
               }
           }
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

ReadMyClass yöntemine sınıfımızın bir örneğini aktarıyoruz .

Ardından readAnnotation yöntemine bir sınıfın yanı sıra bir yöntemi de iletebiliriz . Hadi bunu yapalım — bir Class nesnesi ve bir Method nesnesi geçireceğiz. AnnotatedElement arabirimini uygulayan bir nesne alır . Bu, nesneden ek açıklamaların bir listesini almamızı ve her biri hakkında bilgi almamızı sağlar.

Yalnızca ek açıklamanın bizim ek açıklama türümüze ait olup olmadığını kontrol ettikten sonra bilgi aldığımızı unutmayın: if (annotation instanceof Info) .

Program çıktısı bize ek açıklamalardan tam bilgi verir:

Sınıf: annotation.MyClass1
Java.lang.Class'ta açıklama
ara Yazar: Yazar
Versiyon: 0.0
Java.lang.reflect.Method'da ek açıklama ara
Yazar: Yazar
Versiyon: 0.0

Sınıf: annotation.MyClass2
Java.lang'da ek açıklama ara. Sınıf
Yazarı: Yazar
Sürümü: 2.0
Java.lang.reflect.Method'da ek açıklama ara
Yazar: Anonim
Sürüm: 0.0

Sınıf: annotation.MyClass3
Java.lang.Class'ta ek açıklama ara
Yazar: Anonim
Sürüm: 2.0
Java'da ek açıklama ara. lang.reflect.Method
Yazar: Anonim
Sürüm: 4.0

Böylece, yansıma yardımıyla meta verileri çıkarabildik.

Şimdi genel olarak okunabilirliği, hızı ve kaliteyi artırmak da dahil olmak üzere kodu iyileştirmek için açıklamaları kullanmanın bir örneğine bakalım. Lombok bu konuda bize yardımcı olacak.

Lombok, büyük miktarda kodu gizlemek ve dili genişletmek için ek açıklamaları kullanan, böylece geliştirmeyi basitleştiren ve bazı işlevler ekleyen bir derleyici eklentisidir.

Lombok'tan ek açıklamalara bir örnek düşünün:

@ToString Nesnenin kapsamlı bir temsilinden oluşan toString() yönteminin bir uygulamasını oluşturur : sınıf adı, tüm alanlar ve bunların değerleri.
@ToString
public class Example
@EqualsAndHashCode Varsayılan olarak statik olmayan ve statik olmayan alanları kullanan, ancak yapılandırılabilir olan equals ve hashCode uygulamalarını oluşturur . Daha fazla detay projenin web sitesinde bulunabilir . Orada, @EqualsAndHashCode kullanan ve ek açıklama olmadan standart bir uygulama gösteren bir örnek bulacaksınız .
@Alıcı / @Ayarlayıcı Özel alanlar için alıcılar ve ayarlayıcılar üretir.
@Getter
@Setter
private String name = "name";
@NonNull Bir nesne başlatıldığında alanların boş olmadığını iddia etmek için kullanılır. Aksi takdirde, bir NullPointerException atılır.
public Example(@NonNull P p) {
 super("Hello");
 this.name = p.getName();
}

Lombok, daha az sıklıkla kullanılan daha birçok yararlı ek açıklamaya sahiptir. En basit ek açıklamalarını düşündük. Resmi web sitesinde proje hakkında daha fazla bilgi edinebilirsiniz .