標籤:zha 使用 print dal pre 成功 one 區別 over
參考 thinking in java 4th
概念
註解(也被稱為中繼資料),為我們在代碼中添加資訊提供了一種形式化的方法,使我們可以在稍後某個記錄檔系統非常方便地使用這些資料。
java5內建了三種定義在java.lang中的註解:
@override 表示當前方法將覆蓋超類中的方法
@Deprecated 使用該註解後編輯器會發出警告
@SuppressWarining 將不當的警告關閉
定義註解
1.元註解:定義註解時,會需要一些元註解,可以理解為註解的最基礎的單位,java的元註解如下所示:
2.元素:在註解中,一般都會包括一些元素以表示某些值當分析處理註解時,可以利用這些值。註解的元素看起來像是介面的方法,唯一的區別是你可以為其指定預設值。註解元素的可用類型如下:
- 所有基本類型(int,float,boolean)
- String
- Class
- enum
- Annotation
- 以上類型的數組
*沒有元素的註解稱為標記註解
*如果使用其他類型,編譯器會報錯
舉個例子,以下是一個簡單的註解,該註解包含一個元素:name,該元素有一個default值:annoy,代碼如下:
package annotation.person;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by zuzhaoyue on 18/5/21. */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Person { public String name() default "annoy";}
3.使用
註解的使用表現為索引值對的形式,樣本如下:
package annotation.person;import annotation.person.Person;/** * Created by zuzhaoyue on 18/5/21. */public class PersonUtils { @Person(name = "肉肉") private String employee; @Person(name = "虎虎俠") private String boss; private String lolo;}
編寫註解處理器
如果沒有用來讀取註解的工具,那註解和注釋就差不多了。使用註解的過程中,很重要的一部分就是建立與使用註解處理器。下面是一個簡單的註解處理器,我們用它來讀取PersonUtil類,並用反射機制的getAnnotation()方法來尋找@Person標記,代碼如下:
package annotation.person;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * Created by zuzhaoyue on 18/5/21. */public class PersonTracker { public static void track(List<String> names, Class clazz){ for(Field field:clazz.getDeclaredFields()){ Person person = field.getAnnotation(Person.class); if(person != null){ System.out.println("找到名叫" + person.name() + "的人!他是一名" + field.getName()); names.remove(person.name()); } } if(names != null && names.size() > 0){ for(String name : names){ System.out.println("沒找到名叫" + name + "的人~"); } } } public static void main(String args[]){ List<String> names = new ArrayList<>(); Collections.addAll(names,"肉肉","大扣","虎虎俠"); track(names, PersonUtils.class); }}
這個程式用了兩個反射方法:getDeclaredFields()和getAnnotation(),整體思路很清晰:
1.利用java反射獲得PersonUtil類的所有field
2.遍曆PersonUtil的field,找到有註解為person的field,然後列印出來,並將它從總的name list中刪除
3.列印剩下的沒找到的名稱
測試
執行PersonTracker的main()方法,控制台顯示如下:
調試成功
annotation+java 入門