注解含義
個人理解就是一種帶信息的標簽, 即元數據,描述數據的數據, 這種數據一般不能獨立運行,需要借助外部的代碼或者工具才能發揮作用。使用關鍵字@interface定義一個注解類,本文主要用作快速熟悉的筆記
元注解
用來定義注解的基本注解
- @Retention, 指定生命周期,源代碼中,字節碼文件中,程序時JVM中
- RetentionPolicy.SOURCE 注解只在源碼階段保留,在編譯器進行編譯時它將被丟棄忽視。
- RetentionPolicy.CLASS 注解只被保留到編譯進行的時候,它并不會被加載到 JVM 中。
- RetentionPolicy.RUNTIME 注解可以保留到程序運行的時候,它會被加載進入到 JVM 中,所以在程序運行時可以獲取到它們
- @Documented, 生成javadoc時,該注解會被包含
- @Target, 作用范圍
- ElementType.ANNOTATION_TYPE 可以給一個注解進行注解
- ElementType.CONSTRUCTOR 可以給構造方法進行注解
- ElementType.FIELD 可以給屬性進行注解
- ElementType.LOCAL_VARIABLE 可以給局部變量進行注解
- ElementType.METHOD 可以給方法進行注解
- ElementType.PACKAGE 可以給一個包進行注解
- ElementType.PARAMETER 可以給一個方法內的參數進行注解
- ElementType.TYPE 可以給一個類型進行注解,比如類、接口、枚舉
- @Inherited, 是否可繼承
Inherited 是繼承的意思,但是它并不是說注解本身可以繼承,而是說如果一個超類被 @Inherited 注解過的注解進行注解的話,那么如果它的子類沒有被任何注解應用的話,那么這個子類就繼承了超類的注解。
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface Test {}
@Test
public class A {}
public class B extends A {}
注解 Test 被 @Inherited 修飾,之后類 A 被 Test 注解,類 B 繼承 A,類 B 也擁有 Test 這個注解
- @Repeatable, 1.8引入, 可重復的意思, 該注解可以重復出現
# Persons是一個容器注解,容器注解是用來存放其他注解的地方,本身也是一個注解
public @interface Persons {
Person[] value();
}
@Repeatable(Persons.class)
@interface Person{
String role() default "";
}
@Person(role = "coder")
@Person(role = "PM")
@Person(role = "artist")
class SuperMan{
}
注解的屬性,即成員變量
注解只有成員變量,沒有方法,注解的成員變量在注解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。
# 使用default定義默認值
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnotation {
int id();
String msg() default "";
}
使用:
# 如果注解中只有一個成員變量value,則可以省略括號不寫,不設置屬性值
# 如果注解的屬性設置了默認值,也可以不自定義屬性值
@DemoAnnotation("demo")
public class Demo {
}
java預置的注解
- @Deprecated, 用于標記過時的注解
- @Override,標記該方法要復寫父類中的方法
- @SuppressWarnings,組織警告,某些代碼比如調用過時的方法是編譯器會告警,使用該注解忽略編譯器告警
- @SafeVarargs,參數安全類型注解。它的目的是提醒開發者不要用參數做一些不安全的操作,它的存在會阻止編譯器產生 unchecked 這樣的警告。1.7新增
- @FunctionalInterface, 1.8新增,定義該接口為一個函數式接口
反射+注解
- isAnnotationPresent(),判斷一個Class對象是否應用了某個注解
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
- getAnnotation, 指定注解類型,獲取Class對象上的某個注解對象
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {}
- getAnnotations, 獲取所有的注解對象
public Annotation[] getAnnotations() {}
以上為作用與類上的注解的操作方法,其他作用域的注解類似
注解作用
- 提供信息給編譯器:編譯器可以利用注解來探測錯誤和告警信息
- 編譯階段時的處理:軟件工具可以利用注解信息來生成代碼,HTML文檔或者其他相應的處理
- 運行時的處理:某些注解可以在程序運行的時候接受代碼的提取
浙公網安備 33010602011771號