詳解Java進(jìn)階知識(shí)注解
一、注解的概念
1、注解官方解釋
注解
叫元數(shù)據(jù),一種代碼級(jí)別的說(shuō)明,它是JDK1.5及以后版本引入的一個(gè)特性,與類(lèi)、接口、枚舉在同一個(gè)層次,它可以聲明在包、類(lèi)、字段、局部變量、方法參數(shù)等的前面,用來(lái)對(duì)這些元素進(jìn)行說(shuō)明、注釋。
注解的作用分類(lèi)
- 編寫(xiě)文檔:通過(guò)代碼里表示的元數(shù)據(jù)生成文檔【生成doc文檔】
- 代碼分析:通過(guò)代碼里表示的元數(shù)據(jù)進(jìn)行分析【使用反射】
- 編譯檢查:通過(guò)代碼里表示的元數(shù)據(jù)讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】
注解按照運(yùn)行機(jī)制分類(lèi)
- 源碼注解:注解只在源碼中存在,編譯成.class文件之后就不存在了
- 編譯時(shí)注解:注解在源碼存在的基礎(chǔ)上,也會(huì)在.class文件中存在,但是在運(yùn)行階段中就不存在了,例如:@Override
- 運(yùn)行時(shí)注解:注解在運(yùn)行階段依然存在,且能夠影響程序的運(yùn)行過(guò)程,例如:@Autowired
2、注解與注釋的區(qū)別
(1)注解:用于描述代碼,說(shuō)明程序,主要目的是為了給計(jì)算機(jī)看,且能夠影響程序的運(yùn)行。
(2)注釋?zhuān)河糜诿枋龃a的作用和一些關(guān)鍵性的知識(shí)點(diǎn),使用文字描述程序,是為了給程序員觀(guān)看,以此來(lái)使程序員能夠以最快的時(shí)間了解被注釋的代碼。
二、內(nèi)置注解與元注解
1、常用的內(nèi)置注解
- @Override:檢測(cè)該注解標(biāo)記的方法是否繼承自父類(lèi);
- @Deprecated:說(shuō)明被標(biāo)記的內(nèi)容已過(guò)時(shí),暗示著在不久之后可能會(huì)被更新抹除;
- @SuppressWarnings:壓制警告,就是被標(biāo)記的部分不會(huì)產(chǎn)生警告,常用的參數(shù):@SuppressWarnings(“all”);
- @SafeVarargs:參數(shù)安全類(lèi)型注解,它的目的就是提醒開(kāi)發(fā)者不要用參數(shù)做一些不安全的操作,它的存在會(huì)阻止編譯器產(chǎn)生unchecked這樣的警告;
2、常用的元注解
元注解:用于描述注解的注解,在創(chuàng)建注解時(shí)使用
1. @Target屬性值:
- ElementType.TYPE:能修飾類(lèi)、接口或枚舉類(lèi)型
- ElementType.METHOD:能修飾方法
- ElementType.FIELD: 能修飾成員變量
- ElementType.PARAMETER:能修飾參數(shù)
- ElementType.CONSTRUCTOR:能夠修飾構(gòu)造器
- ElementType.ANNOTATION_TYPE:能夠修飾注解
- ElementType.PACKAGE:能夠修飾包
- ElementType.LOCAL_VARIABLE:能夠修飾局部變量
2.@Retention屬性值:
- RetentionPolicy.SOURCE:注解只在源碼中存在,編譯成class之后就沒(méi)了
- RetentionPolicy.CLASS:注解在源碼和class中都存在,運(yùn)行時(shí)就沒(méi)了,這個(gè)是Retention的默認(rèn)值
- RetentionPolicy.RUNTIME: 注解在源碼、class、運(yùn)行時(shí)都存在,如果要使用反射一定要定義為這種類(lèi)型
3.@Documented:該注解的作用就是表示此注解標(biāo)記的注解可以包含到j(luò)avadoc文件中去
4.@Inherited:描述注解是否能夠被子類(lèi)所繼承
三、自定義注解
1、自定義注解基礎(chǔ)知識(shí)
1.格式:
@Inherited//元注解public @interface zhujie{}
2.注解本質(zhì):注解的本質(zhì)上就是一個(gè)接口,該接口默認(rèn)繼承Annotation
public interface MyAnno extends java.lang.annotation.Annotion
3.屬性:接口中可以定義的內(nèi)容(成員方法、抽象方法)
屬性的返回值:
- 八種基本數(shù)據(jù)類(lèi)型
- 字符串類(lèi)、接口、枚舉
- 注解
- 以上類(lèi)型的數(shù)組
屬性賦值注意事項(xiàng)
- 如果定義屬性時(shí),使用default關(guān)鍵字給屬性默認(rèn)初始化值,則使用注解時(shí),就可以不進(jìn)行屬性的賦值,否則都必須給屬性賦值
- 如果只有一個(gè)屬性需要賦值的話(huà),并且屬性的名稱(chēng)是value,則使用注解給屬性賦值時(shí),value可以省略,直接定義值就可以了
- 數(shù)組賦值時(shí),值需要使用{}包裹,如果數(shù)組中只有一個(gè)值,則{}可以省略不寫(xiě)
2、演示自定義注解的使用
自定義注解annotation
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = ElementType.TYPE) public @interface annotation { String name() default "木魚(yú)"; int age(); int[] score(); }
使用以上注解的類(lèi)TestAnnotation
//name具有默認(rèn)值,不需要必須為name賦值,但也可以重新賦值 @annotation(age=20,score={99,100,100}) public class TestAnnotation { public static void main(String[] args) throws ClassNotFoundException { Class clazz = Class.forName("test.TestAnnotation"); annotation annotation = (annotation) clazz.getAnnotation(annotation.class); System.out.println("姓名:"+annotation.name()+" 年齡:"+annotation.age()); System.out.print("成績(jī)?yōu)椋?); int[] score=annotation.score(); for (int score1:score){ System.out.print(score1+" "); } } }
運(yùn)行結(jié)果
3、演示注解在程序中的作用
兩個(gè)方法:
- 類(lèi)對(duì)象調(diào)用
isAnnotationPresent(Class<? extends Annotation> annotationClass)
判斷是否應(yīng)用了某個(gè)注解 - 通過(guò)getAnnotation()方法獲取Annotation對(duì)象,或者getAnnotations()方法獲取所有應(yīng)用在該類(lèi)上的注解
1.創(chuàng)建自定義注解
@Retention(value = RetentionPolicy.RUNTIME) @Target(value = ElementType.FIELD) public @interface StringNull { }
2.創(chuàng)建實(shí)體類(lèi)
public class Student { @StringNull public String name=null; @StringNull public String xuehao=null; @StringNull public String sex=null; public void setName(String name) { this.name = name; } public void setXuehao(String xuehao) { this.xuehao = xuehao; } public void setSex(String sex) { this.sex = sex; } }
3.創(chuàng)建測(cè)試類(lèi),測(cè)試注解
public class TestAnnotation { public static void main(String[] args) throws Exception{ Class clazz = Class.forName("test.Student"); Student student =(Student) clazz.newInstance(); student.setName("小明"); Field[] fields= clazz.getFields(); for(Field f:fields){ if(f.isAnnotationPresent(StringNull.class)){ if(f.get(student)==null){ System.out.println(f.getName()+":是空的字符串屬性"); }else{ System.out.println(f.getName()+":"+f.get(student)); } } } } }
4.運(yùn)行結(jié)果
以上就是詳解Java進(jìn)階知識(shí)注解的詳細(xì)內(nèi)容,更多關(guān)于Java注解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)現(xiàn)UDP通信過(guò)程實(shí)例分析【服務(wù)器端與客戶(hù)端】
這篇文章主要介紹了Java實(shí)現(xiàn)UDP通信過(guò)程,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)UDP服務(wù)器端與客戶(hù)端相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05SpringBoot定制三種錯(cuò)誤頁(yè)面及錯(cuò)誤數(shù)據(jù)方法示例
Spring Boot提供的默認(rèn)異常處理機(jī)制通常并不一定適合我們實(shí)際的業(yè)務(wù)場(chǎng)景,因此,我們通常會(huì)根據(jù)自身的需要對(duì)Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯(cuò)誤頁(yè)面,定制錯(cuò)誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯(cuò)誤頁(yè)面的實(shí)現(xiàn),快來(lái)學(xué)習(xí)吧2021-12-12java開(kāi)放地址法和鏈地址法解決hash沖突的方法示例
這篇文章主要介紹了java開(kāi)放地址法和鏈地址法解決hash沖突的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法
LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來(lái)的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動(dòng)態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語(yǔ)言之LinkedList和鏈表的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-05-05Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法
這篇文章主要介紹了Java從數(shù)據(jù)庫(kù)中讀取Blob對(duì)象圖片并顯示的方法,實(shí)例分析了Java讀取數(shù)據(jù)庫(kù)中Blob對(duì)象圖片的技巧與操作方法,需要的朋友可以參考下2015-02-02URLConnection發(fā)送HTTP請(qǐng)求的方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了URLConnection發(fā)送HTTP請(qǐng)求的方法,主要介紹了如何通過(guò)Java(模擬瀏覽器)發(fā)送HTTP請(qǐng)求,有興趣的可以了解一下2017-07-07java使用CollectionUtils工具類(lèi)判斷集合是否為空方式
這篇文章主要介紹了java使用CollectionUtils工具類(lèi)判斷集合是否為空方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02使用@PropertySource讀取配置文件通過(guò)@Value進(jìn)行參數(shù)注入
這篇文章主要介紹了使用@PropertySource讀取配置文件通過(guò)@Value進(jìn)行參數(shù)注入,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot2.0集成Swagger2訪(fǎng)問(wèn)404的解決操作
這篇文章主要介紹了SpringBoot2.0集成Swagger2訪(fǎng)問(wèn)404的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09