日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【深入JAVA】java注解

發(fā)布時間:2023/12/6 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深入JAVA】java注解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在閱讀的過程中有不論什么問題,歡迎一起交流

郵箱:1494713801@qq.com???

QQ:1494713801

?

?

1、什么是java注解
? ? 注解,顧名思義,注解,就是對某一事物進(jìn)行加入凝視說明,會存放一些信息。這些信息可能對以后某個時段來說是非常實(shí)用處的。 java提供了一套注解機(jī)制,使得我們能夠?qū)Ψ椒ā㈩悺?shù)、包、域以及變量等加入標(biāo)準(zhǔn)(即附上某些信息)。且在以后某個時段通過反射將標(biāo)注的信息提取出來以供使用。


2、JDK提供的基本注解?
a. @SuppressWarnings 該注解的作用是阻止編譯器發(fā)出某些警告信息。它能夠有下面參數(shù):
? ? deprecation:過時的類或方法警告。
? ? unchecked:運(yùn)行了未檢查的轉(zhuǎn)換時警告。


? ? fallthrough:當(dāng)Switch程序塊直接通往下一種情況而沒有Break時的警告。


? ? path:在類路徑、源文件路徑等中有不存在的路徑時的警告。
? ? serial:當(dāng)在可序列化的類上缺少serialVersionUID定義時的警告。


? ? finally:不論什么finally子句不能完畢時的警告。
? ? all:關(guān)于以上全部情況的警告。


b.@Deprecated 該注解的作用是標(biāo)記某個過時的類或方法。


c. @Override 該注解用在方法前面,用來標(biāo)識該方法是重寫父類的某個方法。

?

3、元注解?
a. @Retention 它是被定義在一個注解類的前面,用來說明該注解的生命周期。它有下面參數(shù):
? ? RetentionPolicy.SOURCE:指定注解僅僅保留在一個源文件其中。
? ? RetentionPolicy.CLASS:指定注解僅僅保留在一個class文件里。
? ? RetentionPolicy.RUNTIME:指定注解能夠保留在程序執(zhí)行期間。
b. @Target 它是被定義在一個注解類的前面,用來說明該注解能夠被聲明在哪些元素前。

它有下面參數(shù):
? ? ElementType.TYPE:說明該注解僅僅能被聲明在一個類前。


? ? ElementType.FIELD:說明該注解僅僅能被聲明在一個類的字段前。
? ? ElementType.METHOD:說明該注解僅僅能被聲明在一個類的方法前。
? ? ElementType.PARAMETER:說明該注解僅僅能被聲明在一個方法參數(shù)。
? ? ElementType.CONSTRUCTOR:說明該注解僅僅能聲明在一個類的構(gòu)造方法前。


? ? ElementType.LOCAL_VARIABLE:說明該注解僅僅能聲明在一個局部變量前。


? ? ElementType.ANNOTATION_TYPE:說明該注解僅僅能聲明在一個注解類型前。
? ? ElementType.PACKAGE:說明該注解僅僅能聲明在一個包名前。

?

4、注解的生命周期
一個注解能夠有三個生命周期,它默認(rèn)的生命周期是保留在一個CLASS文件,但它也能夠由一個@Retetion的元注解指定它的生命周期。
? ? a.java源文件 當(dāng)在一個注解類前定義了一個@Retetion(RetentionPolicy.SOURCE)的注解,那么說明該注解僅僅保留在一個源文件其中。當(dāng)編譯器將源文件編譯成class文件時,它不會將源文件里定義的注解保留在class文件里。


? ? b. class文件里 當(dāng)在一個注解類前定義了一個@Retetion(RetentionPolicy.CLASS)的注解。那么說明該注解僅僅保留在一個class文件其中,當(dāng)載入class文件到內(nèi)存時,虛擬機(jī)會將注解去掉,從而在程序中不能訪問。
? ? c. 程序執(zhí)行期間 當(dāng)在一個注解類前定義了一個@Retetion(RetentionPolicy.RUNTIME)的注解,那么說明該注解在程序執(zhí)行期間都會存在內(nèi)存其中。此時,我們能夠通過反射來獲得定義在某個類上的全部注解。?

5、注解的定義?

一個簡單的注解:
?public @interface Annotation01{
? ? ? ? //定義公共的final靜態(tài)屬性.....
? ? ? ? //定以公共的抽象方法......
?}
? a.注解能夠有哪些成員 注解和接口相似。它僅僅能定義final靜態(tài)屬性和公共抽象方法。
? b.注解的方法 ?
? ? ? 1.方法前默認(rèn)會加上public abstract
? ? ? 2.在聲明方法時能夠定義方法的默認(rèn)返回值。 比如: Stringcolor()default"blue"; String[]color()default{"blue","red",......}
? ? ? 3.方法的返回值能夠有哪些類型 8種基本類型,String、Class、枚舉、注解及這些類型的數(shù)組。
? c.使用注解(參照以下的注解使用)注解的使用分為三個過程。

定義注解-->聲明注解-->得到注解
? ? ? a.定義注解(參照上面的注解定義)
? ? ? b.聲明注解
? ? ? ? ? 1.在哪些元素上聲明注解 假設(shè)定義注解時沒有指定@Target元注解來限制它的使用范圍。那么該注解能夠使用在ElementType枚舉指定的不論什么一個元素前。

否則。僅僅能聲明在@Target元注解指定的元素前。 一般形式: @注解名()
? ? ? ? ? 2.對注解的方法的返回值進(jìn)行賦值 對于注解中定義的每個沒有默認(rèn)返回值的方法。在聲明注解時必須對它的每個方法的返回值進(jìn)行賦值。

一般形式: @注解名(方法名=方法返回值。、、、、、、) 假設(shè)方法返回的是一個數(shù)組時。那么將方法返回值寫在{}符號里 @注解名(方法名={返回值1,返回值2,、、、、、、},、、、、、、、)
? ? ? ? ? 3.對于僅僅含有value方法的注解,在聲明注解時能夠僅僅寫返回值。


? ? ? c.得到注解 對于生命周期為執(zhí)行期間的注解。都能夠通過反射獲得該元素上的注解實(shí)例。
? ? ? ? ? 1、聲明在一個類中的注解 能夠通過該類Class對象的getAnnotation或getAnnotations方法獲得。
? ? ? ? ? 2、聲明在一個字段中的注解 通過Field對象的getAnnotation或getAnnotations方法獲得
? ? ? ? ? 3、聲明在一個方法中的注解 通過Method對象的getAnnotation或getAnnotations方法獲得?

6、樣例
以下講的設(shè)計(jì)一個最簡單的Annotation樣例,這一樣例共用四個文件;
?? 1、Description.java

Java代碼
  • package?lighter.javaeye.com; ??
  • ??
  • import?java.lang.annotation.Documented; ??
  • import?java.lang.annotation.ElementType; ??
  • import?java.lang.annotation.Retention; ??
  • import?java.lang.annotation.RetentionPolicy; ??
  • import?java.lang.annotation.Target; ??
  • ??
  • @Target(ElementType.TYPE) ??
  • @Retention(RetentionPolicy.RUNTIME) ??
  • @Documented??
  • public?@interface?Description?{ ??
  • ????String?value(); ??
  • } ?
  • ?? 說明:全部的Annotation會自己主動繼承java.lang.annotation這一個接口,所以不能再去繼承別的類或是接口.
    ?? 最重要的一點(diǎn),Annotation類型里面的參數(shù)該怎么設(shè)定:
    ?? 第一,僅僅能用public或默認(rèn)(default)這兩個訪問權(quán)修飾.比如,String value();這里把方法設(shè)為defaul默認(rèn)類型.
    ?? 第二,參數(shù)成員僅僅能用基本類型byte,short,char,int,long,float,double,boolean八種基本數(shù)據(jù)類型和String,Enum,Class,annotations等數(shù)據(jù)類型,以及這一些類型的數(shù)組.比如,String value();這里的參數(shù)成員就為String.
    ?? 第三,假設(shè)僅僅有一個參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號.例:上面的樣例就僅僅有一個參數(shù)成員.

    ?? 2、Name.java

    Java代碼
  • package?lighter.javaeye.com; ??
  • ??
  • import?java.lang.annotation.Documented; ??
  • import?java.lang.annotation.ElementType; ??
  • import?java.lang.annotation.Retention; ??
  • import?java.lang.annotation.RetentionPolicy; ??
  • import?java.lang.annotation.Target; ??
  • ??
  • ?//注意這里的@Target與@Description里的不同,參數(shù)成員也不同??
  • @Target(ElementType.METHOD) ??
  • @Retention(RetentionPolicy.RUNTIME) ??
  • @Documented??
  • public?@interface?Name?{ ??
  • ????String?originate(); ??
  • ????String?community(); ??
  • } ?
  • ?? 3、JavaEyer.java

    Java代碼
  • package?lighter.javaeye.com; ??
  • ??
  • @Description("javaeye,做最優(yōu)秀的軟件開發(fā)交流社區(qū)") ??
  • public?class?JavaEyer?{ ??
  • ????@Name(originate="創(chuàng)始人:robbin",community="javaEye") ??
  • ????public?String?getName() ??
  • ????{ ??
  • ????????return?null; ??
  • ????} ??
  • ???? ??
  • ????@Name(originate="創(chuàng)始人:江南白衣",community="springside") ??
  • ????public?String?getName2() ??
  • ????{ ??
  • ????????return?"借用兩位的id一用,寫這一個樣例,請見諒!"; ??
  • ????} ??
  • } ?
  • ?? 4、最后,寫一個能夠執(zhí)行提取JavaEyer信息的類TestAnnotation

    Java代碼
  • ?package?lighter.javaeye.com; ??
  • ??
  • ??import?java.lang.reflect.Method; ??
  • ??import?java.util.HashSet; ??
  • ??import?java.util.Set; ??
  • ??
  • ??public?class?TestAnnotation?{ ??
  • ????/**?
  • ?????*?author?lighter?
  • ?????*?說明:詳細(xì)關(guān)天Annotation的API的使用方法請參見javaDoc文檔?
  • ?????*/??
  • ???????public?static?void?main(String[]?args)?throws?Exception?{ ??
  • ???????String??CLASS_NAME?=?"lighter.javaeye.com.JavaEyer"; ??
  • ???????Class??test?=?Class.forName(CLASS_NAME); ??
  • ???????Method[]?method?=?test.getMethods(); ??
  • ???????boolean?flag?=?test.isAnnotationPresent(Description.class); ??
  • ????????if(flag) ??
  • ????????{ ??
  • ????????????Description?des?=?(Description)test.getAnnotation(Description.class); ??
  • ????????????System.out.println("描寫敘述:"+des.value()); ??
  • ????????????System.out.println("-----------------"); ??
  • ????????} ??
  • ???????? ??
  • ????????//把JavaEyer這一類有利用到@Name的所有方法保存到Set中去??
  • ????????Set<Method>?set?=?new?HashSet<Method>(); ??
  • ????????for(int?i=0;i<method.length;i++) ??
  • ????????{ ??
  • ????????????boolean?otherFlag?=?method[i].isAnnotationPresent(Name.class); ??
  • ????????????if(otherFlag)?set.add(method[i]); ??
  • ????????} ??
  • ????????for(Method?m:?set) ??
  • ????????{ ??
  • ????????????Name?name?=?m.getAnnotation(Name.class); ??
  • ????????????System.out.println(name.originate()); ??
  • ????????????System.out.println("創(chuàng)建的社區(qū):"+name.community()); ??
  • ????????} ??
  • ?????} ??
  • } ?
  • ??? 5、執(zhí)行結(jié)果:
    ???? 描寫敘述:javaeye,做最優(yōu)秀的軟件開發(fā)交流社區(qū)
    ???? -----------------
    ??? 創(chuàng)始人:robbin
    ??? 創(chuàng)建的社區(qū):javaEye
    ??? 創(chuàng)始人:江南白衣
    ? ? 創(chuàng)建的社區(qū):springside?


    總結(jié)

    以上是生活随笔為你收集整理的【深入JAVA】java注解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。