摘要:定義注解,也叫元數(shù)據(jù)。它可以聲明在包類字段方法局部變量方法參數(shù)等的前面,用來對這些元素進(jìn)行說明,注釋。方法返回該程序元素上存在的所有注解。與此接口中的其他方法不同,該方法將忽略繼承的注釋。
定義:
注解(Annotation),也叫元數(shù)據(jù)。一種代碼級別的說明。它是JDK5.0及以后版本引入的一個特性,與類、接口、枚舉是在同一個層次。
它可以聲明在包、類、字段、方法、局部變量、方法參數(shù)等的前面,用來對這些元素進(jìn)行說明,注釋。(“java注解”百度百科)
作用分類:
①編寫文檔:通過代碼里標(biāo)識的元數(shù)據(jù)生成文檔
②代碼分析:通過代碼里標(biāo)識的元數(shù)據(jù)對代碼進(jìn)行分析
③編譯檢查:通過代碼里標(biāo)識的元數(shù)據(jù)讓編譯器能過實現(xiàn)基本的編譯檢查
元注解:
元注解的作用就是注解其他注解。java5.0定義了4個標(biāo)準(zhǔn)的meta-annotation類型,用以對其他的annotation類型做說明,他們分別是:
@Target:
說明了Annotation所修飾的對象的作用:用戶描述注解的使用范圍(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
1.CONSTRUCTOR:用于描述構(gòu)造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部變量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述參數(shù)
7.TYPE:用于描述類、接口(包括注解類型) 或enum聲明
@Retention:
作用:表示需要在什么級別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)
取值(RetentionPolicy)
1.SOURCE:在源文件中有效
2.CLASS:在class文件中有效
3.RUNTIME:在運行時有效
取RUNTIME時,注解處理器可以通過反射,獲取到該注解的屬性值,做一些運行時的邏輯處理。
@Documented:
這是一個標(biāo)記注解
用于描述其它類型的annotation應(yīng)該被作為標(biāo)注的程序成員的公共api,可以文檔化
@Inherited:
標(biāo)記注解
用該注解修飾的注解,會被子類繼承。
自定義注解:
使用@interface來聲明一個注解。其中的每一個方法實際上是聲明了一個配置參數(shù)。方法的名稱就是參數(shù)的名稱。返回值的類型就是參數(shù)的類型。(返回值只能是基本類型、class、String、enum),可以用default來聲明參數(shù)的默認(rèn)值.
格式
public @interface 注解名 {定義體}
注解參數(shù)支持的數(shù)據(jù)類型:
1.所有基本數(shù)據(jù)類型(int,float,boolean,byte,double,char,long,short)
2.String類型
3.Class類型
4.enum類型
5.Annotation類型
6.以上所有類型的數(shù)組
只能用public或者default這兩個訪問權(quán)修飾.注解元素必須有確定的默認(rèn)值,要么在定義的時候指定,要么在使用的時候指定。
例子:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //用于描述域 @Target(ElementType.FIELD) // 運行是有效 @Retention(RetentionPolicy.RUNTIME) public @interface Student { public enum Sex { MAN, WOMAN } /** * 1.參數(shù)成員只能用基本類型String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組 * 2.只能用public或默認(rèn)(default)這兩個訪問權(quán)修飾. 3.如果只有一個參數(shù)成員,最好把參數(shù)名稱設(shè)為"value" */ String name() default ""; // public修飾 public int age() default 18; public Sex sex() default Sex.MAN; }
注解處理器
這是一個自己編寫的工具類,通過注解處理器對程序元素中的注解進(jìn)行操作。
獲得Annotation信息的方法:
方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定類型的注解,如果該類型注解不存在,則返回null。
方法2:Annotation[] getAnnotations():返回該程序元素上存在的所有注解。
方法3:boolean is AnnotationPresent(Annotation):判斷該程序元素上是否包含指定類型的注解,存在則返回true,否則返回false.
方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注釋。與此接口中的其他方法不同,該方法將忽略繼承的注釋。(如果沒有注釋直接存在于此元素上,則返回長度為零的一個數(shù)組。)該方法的調(diào)用者可以隨意修改返回的數(shù)組;這不會對其他調(diào)用者返回的數(shù)組產(chǎn)生任何影響。
public class StudentInfoUtil { public static void getStudentInfo(Class> clazz) { // 獲取程序?qū)ο笏械腇ield注釋 Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { // 判斷是否為Student注釋 if (field.isAnnotationPresent(Student.class)) { // 獲取Annotation對象 Student student = field.getAnnotation(Student.class); System.out.println("姓名" + student.name() + "年齡" + student.age() + "性別" + student.sex()); } } } }
下面寫個實例看它怎么用,先寫一個student實體bean
public class StudentBean { private String name; private int age; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
再寫個測試
public class Test { @Student(name = "Snail", age = 18, sex = Sex.MAN) private StudentBean student01; @Student(name = "Snail2", age = 19, sex = Sex.MAN) private StudentBean student02; public static void main(String[] args) { StudentInfoUtil.getStudentInfo(Test.class); } }
輸出如下:
姓名Snail年齡18性別MAN 姓名Snail2年齡19性別MAN
可以看到,這里注解可以省去重復(fù)聲明賦值的麻煩。
參考
深入理解Java:注解(Annotation)自定義注解入門
深入理解Java:注解(Annotation)--注解處理器
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/64177.html
摘要:從使用到原理學(xué)習(xí)線程池關(guān)于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現(xiàn)在軟件開發(fā)中,分散于應(yīng)用中多出的功能被稱為橫切關(guān)注點如事務(wù)安全緩存等。 Java 程序媛手把手教你設(shè)計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經(jīng)風(fēng)雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當(dāng)初愛情萌芽的模樣…… Java 進(jìn)階面試問題列表 -...
摘要:跟兩年前寫和配置相關(guān)的文件相比,這真是十分的簡單了??梢栽囍鴮懸粋€小小的,有很多視頻教程跟著一步步做就成,我是跟著慕課網(wǎng)上的視頻學(xué)習(xí)的。對于寫快一年的我來說初學(xué)這個還是很欣喜的。 環(huán)境配置 Mac 上搭建 java 開發(fā)環(huán)境http://starzhou.com/blogs/jav... 初始化項目 參考鏈接http://start.spring.io/ 從此鏈接中輸入項目名,并選擇相...
摘要:初步使用注入對象沿用上次的工程新建兩個類和修改其中用來標(biāo)記注入,將注入到中執(zhí)行結(jié)果如下采用注解方式注入對象修改和,加入注解,并賦予默認(rèn)值為類加上注解,即表明此類是為類加上注解,即表明此類是修改,刪除所有子標(biāo)簽,加入自動掃描執(zhí)行結(jié)果 Spring初步使用 注入對象 沿用上次的工程新建兩個類Category和Product Category.java public class Catego...
閱讀 2301·2021-11-24 11:15
閱讀 3186·2021-11-24 10:46
閱讀 1484·2021-11-24 09:39
閱讀 3996·2021-08-18 10:21
閱讀 1539·2019-08-30 15:53
閱讀 1463·2019-08-30 11:19
閱讀 3390·2019-08-29 18:42
閱讀 2426·2019-08-29 16:58