自定義註解

在工作中雖然很少用到,但是我們閱讀源碼的時候需要去了解自定義註解的做法,瞭解自定義註解有助於我們更好的閱讀源碼。
自定義註解很簡單,但是有些細節需要注意的。
1、新創建一個entity

@Getter
@Setter
@ToString
@Entity("city") // 這個是我們自定義的註解
public class CityEntity {
    private int id ;
    private String name ;
}

2、我們去創建自定義註解

// 指定註解的位置 Type是放在class上面  還有method  field 等等
@Target(ElementType.TYPE)
// 指定自定義主機的生命週期  默認的生命週期在運行時就結束了
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
	// 默認的是value方法  也就是  @Entity("xxx")  其實對應的就是value  其中default "" 對應的是 @Entity() 
    public String value() default "";
}

3、我們寫一個幫助類,傳入一個Object類型的類 獲取value的值

public static String getAnnotationValue(Object object) {
        // 通過反射獲取到class
        Class clazz = object.getClass() ;
        // 判斷class是否有這個註解
        if(clazz.isAnnotationPresent(Entity.class)) {
            // 獲取到自定義註解
            Entity entity = (Entity) clazz.getAnnotation(Entity.class);
            String value = entity.value() ;
            System.out.println(value);
        }
        return null ;
    }

4、我們通過測試類測試一下

public static void main(String[] args) {
        CityEntity cityEntity = new CityEntity() ;
        CommUtil.getAnnotationValue(cityEntity) ;
    }

結果:
在這裏插入圖片描述
這樣我們就獲取到了value的值了

其中需要注意:
在這裏插入圖片描述
我們需要指定生命週期,如果我們指定的話 默認的是Class
clazz.isAnnotationPresent(Entity.class) 這段判斷該類是否有註解會得到false,因此我們需要設定他的生命週期
在這裏插入圖片描述
根據不同的情況選擇不同的生命週期

  1. SOURCE:在編譯時丟棄
  2. CLASS:會被保留在類文件中,但是運行時VM不保留
  3. RUNTIME:編譯和運行時保留,可以通過反射讀取。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章