在工作中雖然很少用到,但是我們閱讀源碼的時候需要去了解自定義註解的做法,瞭解自定義註解有助於我們更好的閱讀源碼。
自定義註解很簡單,但是有些細節需要注意的。
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,因此我們需要設定他的生命週期
根據不同的情況選擇不同的生命週期
- SOURCE:在編譯時丟棄
- CLASS:會被保留在類文件中,但是運行時VM不保留
- RUNTIME:編譯和運行時保留,可以通過反射讀取。