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