Java自帶注解、元注解、自定義注解的區(qū)別
什么是注解
1.Annotation是從JDK5.0開始引入的新技術(shù)
2.Annotation的作用 :
(1)不是程序本身,可以對(duì)程序作出解釋(這一點(diǎn)和注釋(comment)沒什么區(qū)別)
(2)可以被其他程序(比如:編譯器等)讀取
3.Annotation的格式:
注解是以"@注釋名"在代碼中存在的,還可以添加一-些參數(shù)值,例如:@SuppressWarnings(value="unchecked")
4.Annotation在哪里使用?
可以附加在package , class , method , field 等上面,相當(dāng)于給他們添加了額外的輔助信息,我們可以通過反射機(jī)制編程實(shí)現(xiàn)對(duì)這些元數(shù)據(jù)的訪問
在java中,注解分為三種類型:自帶注解、元注解、自定義注解。
自帶注解
java自帶注解只有三個(gè):@Override、@Deprecated、@SuppressWarnings
1.@Override :定義在java.lang.Override中,此注釋只適用于修辭方法,表示一個(gè)方法聲明打算重寫超類中的另一個(gè)方法聲明
2.@Deprecated :定義在java.lang.Deprecated中, 此注釋可以用于修辭方法,屬性,類,表示不鼓勵(lì)程序員使用這樣的元素, 通常是因?yàn)樗芪kU(xiǎn)或者存在更好的選擇
3.@SuppressWarnings :定義在java.lang.SuppressWarnings中,用來抑制編譯時(shí)的警告信息
與前兩個(gè)注釋有所不同,你需要添加一個(gè)參數(shù)才能正確使用,這些參數(shù)都是已經(jīng)定義好了的,我們選擇性的使用就好了
(1)@SuppressWarngs("all")
(2)@SuppressWarnings("unchecked")
(3)@SuppressWarnings(value={"unchecked","deprecation"})等等
元注解
元注解是注解的注解,常標(biāo)注于自定義注解之前,用來對(duì)注解的一個(gè)簡單描述。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override{ }
元注解一共有四個(gè):@Target、@Retention、@Inherited、@Documented
- @Target是自定義注釋時(shí)必選的,表示該注解的作用目標(biāo)。
- @Retention注解也是必選的,表示該注解的保留策略。
- @Inherited和@Documented是可選的元注解。
自定義注解
聲明語法:
@Target(ElementType...) @Retention(RetentionPolicy...) 權(quán)限修飾符 @interface 注解名稱(){ //注解體,可以定義屬性 屬性類型 屬性名() default 默認(rèn)值; }
屬性聲明格式:屬性類型 屬性名() default 默認(rèn)值;
屬性類型:基本數(shù)據(jù)類型(byte、short、int、long、float、double、boolean、char)、Class、String、enum、Annotation、以及上述類型的數(shù)組形式。
屬性名():根據(jù)個(gè)人需求聲明屬性名。當(dāng)屬性只有一個(gè)的時(shí)候,一般屬性名都寫成value()。
//Spring框架注解之Component @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Component{ String value() default ""; }
在實(shí)際應(yīng)用中,注解大多與反射結(jié)合使用。一般情況下,注解的使用是不影響代碼的正常執(zhí)行,它只是對(duì)代碼做了一個(gè)簡單的描述。但是通過注解+反射,就能夠在編譯時(shí)或者是運(yùn)行時(shí)對(duì)代碼的執(zhí)行產(chǎn)生影響。
注解只提供對(duì)代碼的描述,不影響代碼的正常執(zhí)行。影響代碼執(zhí)行的是通過反射獲取注解中的屬性
如何利用反射獲取注解內(nèi)容
利用反射獲取注解內(nèi)容步驟:
1.先利用反射獲取Class對(duì)象
2.使用Class.getAnnotations()獲取類上的所有注解內(nèi)容(如果只想獲取注解的值,可以使用Class.getAnnotation(XXX.class)獲取特定的注解,然后在獲取的注解內(nèi)容使用.value()即可以獲取注解的value值)
3.使用Class.getDeclaredField(“XX”)獲取Class對(duì)象的特定內(nèi)容的field對(duì)象,然后使用field.getAnnotation(XXX.class),獲取到注解的內(nèi)容
@Tablemi("mi") class Student2 { ? ? @Fieldmi(name = "id", type = "int", length = 10) ? ? private int id; ? ? @Fieldmi(name = "age", type = "int", length = 3) ? ? private int age; ? ? @Fieldmi(name = "name", type = "varchar", length = 5) ? ? private String name; ? ? ? public Student2() { ? ? } ? ? ? public Student2(int id, int age, String name) { ? ? ? ? this.id = id; ? ? ? ? this.age = age; ? ? ? ? this.name = name; ? ? } ? }//并提供get和set方法 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface Tablemi{ ? ? String value(); } @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @interface Fieldmi{ ? ? String name(); ? ? String type(); ? ? int length(); }
測試代碼:
Class c1 = Class.forName("com.mi.demo01.Student2"); //通過反射獲取注解 Annotation[] annotations = c1.getAnnotations(); for (Annotation annotation : annotations) { System.out.println(annotation); } //獲的注解的value值 Tablemi tablemi = (Tablemi)c1.getAnnotation(Tablemi.class); String value = tablemi.value(); System.out.println(value); //獲得類指定的注解 Field field = c1.getDeclaredField("id"); Fieldmi fieldmi = field.getAnnotation(Fieldmi.class); System.out.println(fieldmi.name()); System.out.println(fieldmi.type()); System.out.println(fieldmi.length()); //獲得類指定的注解 Field field1 = c1.getDeclaredField("name"); Fieldmi fieldmi1 = field1.getAnnotation(Fieldmi.class); System.out.println(fieldmi1.name()); System.out.println(fieldmi1.type()); System.out.println(fieldmi1.length()); //獲得類指定的注解 Field field2 = c1.getDeclaredField("age"); Fieldmi fieldmi2 = field2.getAnnotation(Fieldmi.class); System.out.println(fieldmi2.name()); System.out.println(fieldmi2.type()); System.out.println(fieldmi2.length());
測試結(jié)果:
到此這篇關(guān)于Java自帶注解、元注解、自定義注解的區(qū)別的文章就介紹到這了,更多相關(guān)Java自帶注解 元注解 自定義注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot war包部署到Tomcat服務(wù)器
這篇文章主要介紹了SpringBoot war包部署到Tomcat服務(wù)器,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03SpringBoot@Aspect 打印訪問請(qǐng)求和返回?cái)?shù)據(jù)方式
這篇文章主要介紹了SpringBoot@Aspect 打印訪問請(qǐng)求和返回?cái)?shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09淺析Java虛擬機(jī)詳解之概述、對(duì)象生存法則
這篇文章主要介紹了Java虛擬機(jī)詳解之概述、對(duì)象生存法則,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例
這篇文章主要介紹了SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06使用BitSet位集合,一個(gè)重復(fù)校驗(yàn)工具
這篇文章主要介紹了使用BitSet位集合,一個(gè)重復(fù)校驗(yàn)工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java設(shè)計(jì)模式之裝飾者模式詳解和代碼實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾者模式詳解和代碼實(shí)例,Decorator模式(別名Wrapper):動(dòng)態(tài)將職責(zé)附加到對(duì)象上,若要擴(kuò)展功能,裝飾者提供了比繼承更具彈性的代替方案,需要的朋友可以參考下2014-09-09