注解相當于是標記,它與注釋的區別在于注解的內容可以可以使用,下面,讓我們認識下Java的注解。
要使用注解,我們可以分成三個部分,分別是:注解本身、注解使用類、注解處理類,如下圖:
注解的結構
下面,我們看看代碼怎么操作吧
第一步:新建注解
新建兩個注解,分別是PlayerName與PlayerInfor
PlayerName:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface PlayerName {
String value() default "";
}
PlayerInfor:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface PlayerInfor {
public enum Color{Blue,Red,White};
Color color() default Color.Blue;
int number() default 7;
int age();
String club() default "曼徹斯特聯隊";
}
第二步:定義實體類,并且使用剛剛新建的注解
新建一個FootballPlayer類
FootballPlayer:
public class FootballPlayer {
//將PlayerName注解綁定在實體類的name屬性中
@PlayerName("魯尼")
public String name;
//將PlayerInfor注解綁定在實體類的playInfo屬性中
@PlayerInfor(color=Color.Red,number=10,age=30)
public String playInfo;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPlayInfo() {
return playInfo;
}
public void setPlayInfo(String playInfo) {
this.playInfo = playInfo;
}
}
第三步:定義注解處理類,處理實體類的注解
新建AnnoUtil工具類
AnnoUtil:
import java.lang.reflect.Field;
public class AnnoUtil {
public static void getPlayerInfo(Class clazz){
/*獲取實體類的所有屬性*/
Field[] fields = clazz.getFields();
//循環抽取實體類屬性中的注解
for(Field field:fields){
//匹配注解
if(field.isAnnotationPresent(PlayerName.class)){
//獲取注解
PlayerName name = field.getAnnotation(PlayerName.class);
//使用注解
System.out.println("運動員名字:"+name.value());
}else if(field.isAnnotationPresent(PlayerInfor.class)){
//獲取注解
PlayerInfor infor = field.getAnnotation(PlayerInfor.class);
//使用注解
System.out.println("所屬球隊:"+infor.club()+",代表顏色:"
+infor.color()+",號碼:"+infor.number()+",年齡:"+infor.age());
}
}
}
}
第四步:調用處理類的處理方法
public static void main(String[] args) {
AnnoUtil.getPlayerInfo(FootballPlayer.class);
}
輸出結果如下:
運動員名字:魯尼
所屬球隊:曼徹斯特聯隊,代表顏色:Red,號碼:10,年齡:30
從以上程序可以理解為:實體類與注解的關系就像文章與筆記,而注解處理類就像是人;人讀了帶有筆記的文章,加以分析處理,輸出想要表達的結果。
附:
Java中提供了四種元注解,專門負責注解其他的注解,分別如下
@Retention元注解,表示需要在什么級別保存該注釋信息(生命周期)。可選的RetentionPoicy參數包括:
RetentionPolicy.SOURCE: 停留在java源文件,編譯器被丟掉
RetentionPolicy.CLASS:停留在class文件中,但會被VM丟棄(默認)
RetentionPolicy.RUNTIME:內存中的字節碼,VM將在運行時也保留注解,因此可以通過反射機制讀取注解的信息
@Target元注解,默認值為任何元素,表示該注解用于什么地方。可用的ElementType參數包括
ElementType.CONSTRUCTOR: 構造器聲明
ElementType.FIELD: 成員變量、對象、屬性(包括enum實例)
ElementType.LOCAL_VARIABLE: 局部變量聲明
ElementType.METHOD: 方法聲明
ElementType.PACKAGE: 包聲明
ElementType.PARAMETER: 參數聲明
ElementType.TYPE: 類、接口(包括注解類型)或enum聲明
@Documented將注解包含在JavaDoc中
@Inheried允許子類繼承父類中的注解
?我剛整理了一套2018最新的0基礎入門和進階教程,無私分享,加Java學習裙 :678-241-563 即可獲取,內附:開發工具和安裝包,以及系統學習路線圖。