Özet - Annotation
- Java kursu
- İleri seviye
- Ders 36/82
- 5 dk
@interface ve @Retention'ı birleştirerek bir işaretleme framework'ü yazarsın.
Özet - Annotation
Bu grupta annotation'ları öğrendik: @interface ile tanımlama, @Retention ve @Target ile davranışını belirleme, öğe ve default değerleri ve reflection ile okuma. Şimdi tekrar annotation'ları bir araya getireceğiz.
Yerleşik annotation'lar derleyiciye ipucu verirken, kendi tanımladıklarımız çerçevelerin sınıfları otomatik keşfetmesini sağlar. Bir annotation'ın çalışma anında okunabilmesi için RUNTIME retention şarttır. Şimdi son bir özellik olan repeatable annotation'lara bakalım.
Repeatable annotation
Normalde bir annotation aynı öğeye iki kez uygulanamaz. @Repeatable meta-annotation'ı bu kısıtı kaldırır; ancak bir taşıyıcı annotation tanımlamak gerekir.
Taşıyıcı, tekrar edilen annotation'ın dizisini tutan bir annotation'dır: @interface Roles { Role[] value(); }. Tekrar edilebilir annotation @Repeatable(Roles.class) ile işaretlenir. Sonra @Role("admin") @Role("editor") biçiminde aynı öğeye iki kez uygulanabilir; reflection ile getAnnotationsByType(Role.class) ikisini de döndürür.
Uygulama Repeatable Role annotation'ını say
Bir @interface Role tanımla: String value(), üstüne @Repeatable(Roles.class), @Retention(RUNTIME), @Target(TYPE). Bir @interface Roles taşıyıcı tanımla: Role[] value(), üstüne @Retention(RUNTIME) @Target(TYPE). User sınıfına @Role("admin") ve @Role("editor") ekle. main içinde getAnnotationsByType(Role.class).length sonucunu System.out.println ile yazdır.
Başlangıç kodu
// Role annotation'ını ve Roles taşıyıcıyı tanımla
// User sınıfına iki Role ekle
// main içinde sayıyı yazdırÖrnek çözüm
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Repeatable(Roles.class)
@interface Role { String value(); }
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Roles { Role[] value(); }
@Role("admin")
@Role("editor")
class User { }
public class RoleCount {
public static void main(String[] args) {
int n = User.class.getAnnotationsByType(Role.class).length;
System.out.println(n);
}
}Beklenen çıktı
2
Uygulama Version annotation'ını denetle ve oku
Bir @interface Version tanımla: int value(), üstüne @Retention(RetentionPolicy.RUNTIME) ve @Target(ElementType.TYPE). App sınıfına @Version(3) ekle. main içinde önce isAnnotationPresent ile varlığını, sonra getAnnotation ile değerini System.out.println ile yazdır.
Başlangıç kodu
// Version annotation'ını tanımla (RUNTIME, TYPE)
// App sınıfına Version uygula
// main içinde varlık ve değer yazdırÖrnek çözüm
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Version { int value(); }
@Version(3)
class App { }
public class VersionCheck {
public static void main(String[] args) {
System.out.println(App.class.isAnnotationPresent(Version.class));
System.out.println(App.class.getAnnotation(Version.class).value());
}
}Beklenen çıktı
true 3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir annotation'ı reflection ile okumak için hangi retention gerekir?
- RetentionPolicy.SOURCE
- RetentionPolicy.CLASS
- ElementType.METHOD
- RetentionPolicy.RUNTIME Doğru cevap
Açıklama: RUNTIME annotation'lar reflection ile okunur.
2 @Repeatable tanımını tamamla
@Repeatable(____.class)
@Repeatable(Roles.class)
Açıklama: Taşıyıcı annotation sınıfı verilir.