Java自帶注解、元注解、自定義注解的區(qū)別
什么是注解
1.Annotation是從JDK5.0開始引入的新技術(shù)
2.Annotation的作用 :
(1)不是程序本身,可以對程序作出解釋(這一點和注釋(comment)沒什么區(qū)別)
(2)可以被其他程序(比如:編譯器等)讀取
3.Annotation的格式:
注解是以"@注釋名"在代碼中存在的,還可以添加一-些參數(shù)值,例如:@SuppressWarnings(value="unchecked")
4.Annotation在哪里使用?
可以附加在package , class , method , field 等上面,相當(dāng)于給他們添加了額外的輔助信息,我們可以通過反射機制編程實現(xiàn)對這些元數(shù)據(jù)的訪問
在java中,注解分為三種類型:自帶注解、元注解、自定義注解。
自帶注解
java自帶注解只有三個:@Override、@Deprecated、@SuppressWarnings
1.@Override :定義在java.lang.Override中,此注釋只適用于修辭方法,表示一個方法聲明打算重寫超類中的另一個方法聲明
2.@Deprecated :定義在java.lang.Deprecated中, 此注釋可以用于修辭方法,屬性,類,表示不鼓勵程序員使用這樣的元素, 通常是因為它很危險或者存在更好的選擇
3.@SuppressWarnings :定義在java.lang.SuppressWarnings中,用來抑制編譯時的警告信息
與前兩個注釋有所不同,你需要添加一個參數(shù)才能正確使用,這些參數(shù)都是已經(jīng)定義好了的,我們選擇性的使用就好了
(1)@SuppressWarngs("all")
(2)@SuppressWarnings("unchecked")
(3)@SuppressWarnings(value={"unchecked","deprecation"})等等
元注解
元注解是注解的注解,常標注于自定義注解之前,用來對注解的一個簡單描述。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override{ }
元注解一共有四個:@Target、@Retention、@Inherited、@Documented
- @Target是自定義注釋時必選的,表示該注解的作用目標。
- @Retention注解也是必選的,表示該注解的保留策略。
- @Inherited和@Documented是可選的元注解。
自定義注解
聲明語法:
@Target(ElementType...) @Retention(RetentionPolicy...) 權(quán)限修飾符 @interface 注解名稱(){ //注解體,可以定義屬性 屬性類型 屬性名() default 默認值; }
屬性聲明格式:屬性類型 屬性名() default 默認值;
屬性類型:基本數(shù)據(jù)類型(byte、short、int、long、float、double、boolean、char)、Class、String、enum、Annotation、以及上述類型的數(shù)組形式。
屬性名():根據(jù)個人需求聲明屬性名。當(dāng)屬性只有一個的時候,一般屬性名都寫成value()。
//Spring框架注解之Component @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Component{ String value() default ""; }
在實際應(yīng)用中,注解大多與反射結(jié)合使用。一般情況下,注解的使用是不影響代碼的正常執(zhí)行,它只是對代碼做了一個簡單的描述。但是通過注解+反射,就能夠在編譯時或者是運行時對代碼的執(zhí)行產(chǎn)生影響。
注解只提供對代碼的描述,不影響代碼的正常執(zhí)行。影響代碼執(zhí)行的是通過反射獲取注解中的屬性
如何利用反射獲取注解內(nèi)容
利用反射獲取注解內(nèi)容步驟:
1.先利用反射獲取Class對象
2.使用Class.getAnnotations()獲取類上的所有注解內(nèi)容(如果只想獲取注解的值,可以使用Class.getAnnotation(XXX.class)獲取特定的注解,然后在獲取的注解內(nèi)容使用.value()即可以獲取注解的value值)
3.使用Class.getDeclaredField(“XX”)獲取Class對象的特定內(nèi)容的field對象,然后使用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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot war包部署到Tomcat服務(wù)器
這篇文章主要介紹了SpringBoot war包部署到Tomcat服務(wù)器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03SpringBoot@Aspect 打印訪問請求和返回數(shù)據(jù)方式
這篇文章主要介紹了SpringBoot@Aspect 打印訪問請求和返回數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實例
這篇文章主要介紹了SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06