Java
Özet - Annotation
@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.
Örnek çözümü göster
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);
}
}
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.
Örnek çözümü göster
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());
}
}
Kendini test et
-
Bir annotation'ı reflection ile okumak için hangi retention gerekir?
- RetentionPolicy.SOURCE
- RetentionPolicy.CLASS
- ElementType.METHOD
- RetentionPolicy.RUNTIME
Cevabı göster
RetentionPolicy.RUNTIME — RUNTIME annotation'lar reflection ile okunur.
-
@Repeatable tanımını tamamla
@Repeatable(____.class)
Cevabı göster
@Repeatable(Roles.class)
Sıradaki ders: Singleton