public @interface AnAnnotaton {}
帶有此注釋的類:
@AnAnnotaton
class AnAnnotatedClass{}
還有一個測試,檢查類中是否存在此批注:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;import java.lang.annotation.Annotation;
import org.junit.Test;public class AnAnnotationTest {@Testpublic void testAnAnnotation() throws Exception {AnAnnotatedClass anAnnotatedClass = new AnAnnotatedClass();Annotation[] annotationsOnClass = anAnnotatedClass.getClass().getAnnotations();assertThat(annotationsOnClass.length, is(1));}}
聽起來是合理的權利,由于該類的確具有AnAnnotation注釋,因此可以期望上述測試通過。
但是,此測試失敗,原因是…
注釋上缺少一個元注釋(@Retention),它指示該注釋將保留多長時間,如果上述注釋按如下所述更改,則測試將按預期進行。
@Retention(RetentionPolicy.RUNTIME)
public @interface AnAnnotaton {}
那么@Retention的作用是-引用Javadoc:
指示注釋類型的注釋將保留多長時間。 如果注釋類型聲明上沒有保留注釋,則保留策略默認為RetentionPolicy.CLASS
有三種不同的保留政策:
1. SOURCE –注釋由編譯器刪除
2. CLASS –注釋存在于字節碼中,但在運行時不存在,因此在嘗試以反射方式確定類是否具有注釋時不可用。 3.運行時–注釋保留在字節碼中,并且在運行時可用,因此可以在類上反射地找到。
這就是為什么當注釋定義更改為包括@Retention(RetentionPolicy.RUNTIME)時,測試現在可以運行的原因。
基本的東西,但容易錯過。
參考: Java注釋 -all 和雜物博客上的JCG合作伙伴 Biju Kunjummen 保留的內容 。
翻譯自: https://www.javacodegeeks.com/2012/09/java-annotations-retention.html