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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Annotation之一:Java Annotation基本功能介绍

發(fā)布時(shí)間:2025/5/22 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Annotation之一:Java Annotation基本功能介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、元數(shù)據(jù)的作用

如果要對(duì)于元數(shù)據(jù)的作用進(jìn)行分類,目前還沒(méi)有明確的定義,不過(guò)我們可以根據(jù)它所起的作用,大致可分為三類:

  • 編寫文檔:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)生成文檔。這是最常見的,也是java 最早提供的注解。常用的有@see @param @return 等
  • 代碼分析:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)對(duì)代碼進(jìn)行分析。跟蹤代碼依賴性,實(shí)現(xiàn)替代配置文件功能。比較常見的是spring 2.5 開始的基于注解配置。作用就是減少配置。現(xiàn)在的框架基本都使用了這種配置來(lái)減少配置文件的數(shù)量。以后java的程序開發(fā),最多的也將實(shí)現(xiàn)注解配置,具有很大用處;
  • 編譯檢查:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)讓編譯器能實(shí)現(xiàn)基本的編譯檢查。如@override 放在方法前,如果你這個(gè)方法并不是覆蓋了超類方法,則編譯時(shí)就能檢查出。
  • 二、jdk基本內(nèi)置注釋

    ??? @Override注釋能實(shí)現(xiàn)編譯時(shí)檢查,你可以為你的方法添加該注釋,以聲明該方法是用于覆蓋父類中的方法。如果該方法不是覆蓋父類的方法,將會(huì)在編譯時(shí)報(bào)錯(cuò)。例如我們?yōu)槟愁愔貙憈oString()方法卻寫成了tostring(),并且我們?yōu)樵摲椒ㄌ砑恿?#64;Override注釋;

    ???? @Deprecated的作用是對(duì)不應(yīng)該在使用的方法添加注釋,當(dāng)編程人員使用這些方法時(shí),將會(huì)在編譯時(shí)顯示提示信息,它與javadoc里的@deprecated標(biāo)記有相同的功能,準(zhǔn)確的說(shuō),它還不如javadoc @deprecated,因?yàn)樗恢С謪?shù),

    注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:deprecation 重新編譯。(見《注解中的-Xlint:unchecked和 -Xlint:deprecation》)

    ??? @SuppressWarnings與前兩個(gè)注釋有所不同,你需要添加一個(gè)參數(shù)才能正確使用,這些參數(shù)值都是已經(jīng)定義好了的,我們選擇性的使用就好了,參數(shù)如下:

    • deprecation?? 使用了過(guò)時(shí)的類或方法時(shí)的警告
    • unchecked? 執(zhí)行了未檢查的轉(zhuǎn)換時(shí)的警告,例如當(dāng)使用集合時(shí)沒(méi)有用泛型 (Generics) 來(lái)指定集合保存的類型
    • fallthrough?? 當(dāng) Switch 程序塊直接通往下一種情況而沒(méi)有 Break 時(shí)的警告
    • path?? 在類路徑、源文件路徑等中有不存在的路徑時(shí)的警告
    • serial 當(dāng)在可序列化的類上缺少 serialVersionUID 定義時(shí)的警告
    • finally??? 任何 finally 子句不能正常完成時(shí)的警告
    • all 關(guān)于以上所有情況的警告

    注意:要了解詳細(xì)信息,請(qǐng)使用 -Xlint:unchecked 重新編譯。(見《Annotation之四:注解中的-Xlint:unchecked和 -Xlint:deprecation》)

    ?

    在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語(yǔ)法。

    三、Java5.0中新增的4種元注解:

      元注解的作用就是負(fù)責(zé)注解其他注解。Java5.0定義了4個(gè)標(biāo)準(zhǔn)的meta-annotation類型,它們被用來(lái)提供對(duì)其它 annotation類型作說(shuō)明。

    • 注解方法不能有參數(shù)。
    • 注解方法的返回類型局限于原始類型字符串枚舉注解,或以上類型構(gòu)成的數(shù)組
    • 注解方法可以包含默認(rèn)值。
    • 注解可以包含與其綁定的元注解,元注解為注解提供信息,

    Java5.0以后jdk定義了四種元注解有:  

    1、@Documented –注解文檔提取,注解是否將包含在JavaDoc中。
    2、@Retention –注解保留策略,什么時(shí)候使用該注解。
    3、@Target? –注解修飾目標(biāo),注解用于什么地方。
    4、@Inherited – 注解繼承聲明,是否允許子類繼承該注解。

    3.1、@Documented

    @Documented用于描述其它類型的annotation應(yīng)該被作為被標(biāo)注的程序成員的公共API,因此可以被例如javadoc此類的工具文檔化。Documented是一個(gè)標(biāo)記注解,沒(méi)有成員。

    示例說(shuō)明:看下面的示例加強(qiáng)理解下:

    package com.dxz.nettydemo.duan; import java.lang.annotation.Target; import java.lang.annotation.Documented; import java.lang.annotation.ElementType;@Documented @Target(ElementType.TYPE) public @interface Table {/*** 數(shù)據(jù)表名稱注解,默認(rèn)值為類名稱* @return*/public String tableName() default "className"; }

    用javadoc生成doc文檔

    javadoc -encoding UTF-8 Table.java

    打開html文件可以看到j(luò)ava源碼中的注釋信息,如下:

    ?

    3.2、@Retention

    @Retention定義了該Annotation被保留的時(shí)間長(zhǎng)短:某些Annotation僅出現(xiàn)在源代碼中,而被編譯器丟棄;而另一些卻被編譯在class文件中;編譯在class文件中的Annotation可能會(huì)被虛擬機(jī)忽略,而另一些在class被裝載時(shí)將被讀取(請(qǐng)注意并不影響class的執(zhí)行,因?yàn)锳nnotation與class在使用上是被分離的)。使用這個(gè)meta-Annotation可以對(duì) Annotation的“生命周期”限制。

      作用:表示需要在什么級(jí)別保存該注釋信息,用于描述注解的生命周期(即:被描述的注解在什么范圍內(nèi)有效)

      取值(RetentionPoicy)有:

        1.RetentionPolicy.SOURCE:在源文件中有效(--?注解只存在于源代碼中,字節(jié)碼Class文件中將不存在該注解。)
        2.RetentionPolicy.CLASS:在class文件中有效(?--?標(biāo)明注解只會(huì)被編譯器編譯后保留在Class字節(jié)碼文件中,而運(yùn)行時(shí)無(wú)法獲取。)
        3.RetentionPolicy.RUNTIME:在運(yùn)行時(shí)有效(--?標(biāo)明注解會(huì)保留在class字節(jié)碼文件中,且運(yùn)行時(shí)能通過(guò)反射機(jī)制獲取。)

    Retention meta-annotation類型有唯一的value作為成員,它的取值來(lái)自java.lang.annotation.RetentionPolicy的枚舉類型值。

    ?

    示例說(shuō)明:Column注解的的RetentionPolicy的屬性值是RUTIME,這樣注解處理器可以通過(guò)反射,獲取到該注解的屬性值,從而去做一些運(yùn)行時(shí)的邏輯處理。

    package com.dxz.nettydemo.duan;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column {public String name() default "fieldName";public String setFuncName() default "setField";public String getFuncName() default "getField"; public boolean defaultDBValue() default false; }

    ?

    3.3、@Target?

      @Target說(shuō)明了Annotation所修飾的對(duì)象范圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構(gòu)造方法、成員變量、枚舉值)、方法參數(shù)和本地變量(如循環(huán)變量、catch參數(shù))。在Annotation類型的聲明中使用了target可更加明晰其修飾的目標(biāo)。

    作用:用于描述注解的使用范圍(即:被描述的注解可以用在什么地方)

    如果不明確指出,該注解可以放在任何地方。以下是一些可用的參數(shù)。需要說(shuō)明的是:屬性的注解是兼容的,如果你想給7個(gè)屬性都添加注解,僅僅排除一個(gè)屬性,那么你需要在定義target包含所有的屬性。

    取值(ElementType)有:

  • ElementType.TYPE:用于描述類、接口或enum聲明
  • ElementType.FIELD:用于描述實(shí)例變量
  • ElementType.METHOD:用于描述方法
  • ElementType.PARAMETER:用于描述參數(shù)
  • ElementType.CONSTRUCTOR :用于描述構(gòu)造器
  • ElementType.LOCAL_VARIABLE:用于描述局部變量
  • ElementType.ANNOTATION_TYPE:另一個(gè)注釋
  • ElementType.PACKAGE :用于記錄java文件的package信息
  • ?示例說(shuō)明,上面示例中的代碼表明:注解Table 可以用于注解類、接口(包括注解類型) 或enum聲明

    @Target(ElementType.TYPE) public @interface Table {
    ...

    3.4、@Inherited?

    @Inherited 元注解是一個(gè)標(biāo)記注解,@Inherited闡述了某個(gè)被標(biāo)注的類型是被繼承的。如果一個(gè)使用了@Inherited修飾的annotation類型被用于一個(gè)class,則這個(gè)annotation將被用于該class的子類。

      注意:@Inherited annotation類型是被標(biāo)注過(guò)的class的子類所繼承。類并不從它所實(shí)現(xiàn)的接口繼承annotation,方法并不從它所重載的方法繼承annotation

      當(dāng)@Inherited annotation類型標(biāo)注的annotation的Retention是RetentionPolicy.RUNTIME,則反射API增強(qiáng)了這種繼承性。如果我們使用java.lang.reflect去查詢一個(gè)@Inherited annotation類型的annotation時(shí),反射代碼檢查將展開工作:檢查class和其父類,直到發(fā)現(xiàn)指定的annotation類型被發(fā)現(xiàn),或者到達(dá)類繼承結(jié)構(gòu)的頂層。

    ?詳細(xì)見《Annotation之二:@Inherited注解繼承情況》

    四、自定義注解

      使用@interface自定義注解時(shí),自動(dòng)繼承了java.lang.annotation.Annotation接口,由編譯程序自動(dòng)完成其他細(xì)節(jié)。在定義注解時(shí),不能繼承其他的注解或接口。@interface用來(lái)聲明一個(gè)注解,其中的每一個(gè)方法實(shí)際上是聲明了一個(gè)配置參數(shù)。方法的名稱就是參數(shù)的名稱,返回值類型就是參數(shù)的類型(返回值類型只能是基本類型、Class、String、enum)。可以通過(guò)default來(lái)聲明參數(shù)的默認(rèn)值。

    1、定義注解格式:

    public @interface 注解名 {定義體}

      注解參數(shù)的可支持?jǐn)?shù)據(jù)類型:

        1.所有基本數(shù)據(jù)類型(int,float,boolean,byte,double,char,long,short)
        2.String類型
        3.Class類型
        4.enum類型
        5.Annotation類型
        6.以上所有類型的數(shù)組

      Annotation類型里面的參數(shù)該怎么設(shè)定:?
      第一,只能用public或默認(rèn)(default)這兩個(gè)訪問(wèn)權(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;
      第三,如果只有一個(gè)參數(shù)成員,最好把參數(shù)名稱設(shè)為"value",后加小括號(hào).例:下面的例子FruitName注解就只有一個(gè)參數(shù)成員。

    2、@interface說(shuō)明:

  • @interface用來(lái)定義注解標(biāo)記,實(shí)際上該接口繼承自java.lang.annotation.Annotation接口
  • @是寫給編譯器看,javac一看到就知道這是一個(gè)注釋
  • 3、根據(jù)Annotation是否包含成員變量,可以把Annotation分為兩類:

  • 標(biāo)記Annotation: 沒(méi)有成員變量的Annotation; 這種Annotation僅利用自身的存在與否來(lái)提供信息;
  • 元數(shù)據(jù)Annotation: 包含成員變量的Annotation; 它們可以接受(和提供)更多的元數(shù)據(jù);
  • ?

    簡(jiǎn)單的自定義注解和使用注解實(shí)例:

    package com.dxz.annotation; 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.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitName {String value() default ""; } package com.dxz.annotation;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.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitColor {/*** 顏色枚舉*/public enum Color {BULE, RED, GREEN};/*** 顏色屬性* @return*/Color fruitColor() default Color.GREEN; } package com.dxz.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface FruitProvider {int id() default 0;String user() default "duan";String address() default "shenzhen futian";} package com.dxz.annotation;import com.dxz.annotation.FruitColor.Color;public class Apple {@FruitName("Apple")private String appleName;@FruitColor(fruitColor = Color.RED)private String appleColor;@FruitProvider(id=1,user="Tom",address="China")private FruitProvider provider; }package com.dxz.annotation;import java.lang.reflect.Field;public class Test {public static void getFruitInfo(String clas) {try {Class<?> cls = Class.forName(clas);Field[] fields = cls.getDeclaredFields();for (Field field : fields) {if (field.isAnnotationPresent(FruitName.class) == true) {FruitName name = field.getAnnotation(FruitName.class);System.out.println("Fruit Name:" + name.value());}if (field.isAnnotationPresent(FruitColor.class)) {FruitColor color = field.getAnnotation(FruitColor.class);System.out.println("Fruit Color:" + color.fruitColor());}if (field.isAnnotationPresent(FruitProvider.class)) {FruitProvider Provider = field.getAnnotation(FruitProvider.class);System.out.println("Fruit FruitProvider: ProviderID:"+ Provider.id() + " Provider:" + Provider.user()+ " ProviderAddress:" + Provider.address());}}} catch (ClassNotFoundException e) {e.printStackTrace();}}public static void main(String[] args) {getFruitInfo("com.dxz.annotation.Apple");}}

    結(jié)果:

    Fruit Name:Apple Fruit Color:RED Fruit FruitProvider: ProviderID:1 Provider:Tom ProviderAddress:China

    ?


    注解元素的默認(rèn)值:

      注解元素必須有確定的值,要么在定義注解的默認(rèn)值中指定,要么在使用注解時(shí)指定,非基本類型的注解元素的值不可為null。因此, 使用空字符串或0作為默認(rèn)值是一種常用的做法。這個(gè)約束使得處理器很難表現(xiàn)一個(gè)元素的存在或缺失的狀態(tài),因?yàn)槊總€(gè)注解的聲明中,所有元素都存在,并且都具有相應(yīng)的值,為了繞開這個(gè)約束,我們只能定義一些特殊的值,例如空字符串或者負(fù)數(shù),一次表示某個(gè)元素不存在,在定義注解時(shí),這已經(jīng)成為一個(gè)習(xí)慣用法。

    ?

    五、讀取注釋信息(Java注解解析)

      當(dāng)我們想讀取某個(gè)注釋信息時(shí),我們是在運(yùn)行時(shí)通過(guò)反射來(lái)實(shí)現(xiàn)的,如果你對(duì)元注釋還有點(diǎn)印象,那你應(yīng)該記得我們需要將保持性策略設(shè)置為RUNTIME,也就 是說(shuō)只有注釋標(biāo)記了@Retention(RetentionPolicy.RUNTIME)的,我們才能通過(guò)反射來(lái)獲得相關(guān)信息。

    詳細(xì)見《Annotation之三:自定義注解示例,利用反射進(jìn)行解析》

    六、為注解增加高級(jí)屬性

    6.1、數(shù)組類型的屬性

    • 增加數(shù)組類型的屬性:int[] arrayAttr() default {1,2,4};
    • 應(yīng)用數(shù)組類型的屬性:@MyAnnotation(arrayAttr={2,4,5})
    • 如果數(shù)組屬性只有一個(gè)值,這時(shí)候?qū)傩灾挡糠挚梢允÷源罄ㄌ?hào),如:@MyAnnotation(arrayAttr=2),這就表示數(shù)組屬性只有一個(gè)值,值為2

    6.2.、枚舉類型的屬性

    • 增加枚舉類型的屬性:EumTrafficLamp lamp() default EumTrafficLamp.RED;
    • 應(yīng)用枚舉類型的屬性:@MyAnnotation(lamp=EumTrafficLamp.GREEN)

    6.3、注解類型的屬性

    package com.dxz.annotation;/*** MetaAnnotation注解類為元注解*/ public @interface MetaAnnotation {String value();// 元注解MetaAnnotation設(shè)置有一個(gè)唯一的屬性value }

    為注解添加一個(gè)注解類型的屬性,并指定注解屬性的缺省值:MetaAnnotation annotationAttr() default @MetaAnnotation("xdp");

    6.4、示例

    package com.dxz.annotation;public enum EumTrafficLamp {RED, //YELLOW, //GREEN// } package com.dxz.annotation;import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME) //Retention注解決定MyAnnotation注解的生命周期 @Target({ ElementType.METHOD, ElementType.TYPE }) public @interface MyAnnotation {String color() default "blue";// 為屬性指定缺省值/*** 為注解添加value屬性,這個(gè)value屬性很特殊,如果一個(gè)注解中只有一個(gè)value屬性要設(shè)置,* 那么在設(shè)置注解的屬性值時(shí),可以省略屬性名和等號(hào)不寫, 直接寫屬性值,如@SuppressWarnings("deprecation"),* 這里的MyAnnotation注解設(shè)置了兩個(gè)String類型的屬性,color和value,* 因?yàn)閏olor屬性指定有缺省值,value屬性又是屬于特殊的屬性,因此使用MyAnnotation注解時(shí)* 可以這樣使用MyAnnotation注解:"@MyAnnotation(color="red",value="xdp")"* 也可以這樣使用:"@MyAnnotation("* test")",這樣寫就表示MyAnnotation注解只有一個(gè)value屬性要設(shè)置,color屬性采用缺省值* 當(dāng)一個(gè)注解只有一個(gè)value屬性要設(shè)置時(shí),是可以省略"value="的*/String value();// 定義一個(gè)名稱為value的屬性// 添加一個(gè)int類型數(shù)組的屬性int[] arrayAttr() default { 1, 2, 4 };// 添加一個(gè)枚舉類型的屬性,并指定枚舉屬性的缺省值,缺省值只能從枚舉類EumTrafficLamp中定義的枚舉對(duì)象中取出任意一個(gè)作為缺省值EumTrafficLamp lamp() default EumTrafficLamp.RED;// 為注解添加一個(gè)注解類型的屬性,并指定注解屬性的缺省值MetaAnnotation annotationAttr() default @MetaAnnotation("xdp");} package com.dxz.annotation;/*** 這里是將新創(chuàng)建好的注解類MyAnnotation標(biāo)記到AnnotaionTest類上, 并應(yīng)用了注解類MyAnnotation中定義各種不同類型的的屬性*/ @MyAnnotation(color = "red", value = "test", arrayAttr = { 3, 5, 6 }, lamp = EumTrafficLamp.GREEN, annotationAttr = @MetaAnnotation("gacl")) public class MyAnnotationTest {@MyAnnotation("將MyAnnotation注解標(biāo)注到main方法上")public static void main(String[] args) {/*** 這里是檢查Annotation類是否有注解,這里需要使用反射才能完成對(duì)Annotation類的檢查*/if (MyAnnotationTest.class.isAnnotationPresent(MyAnnotation.class)) {/*** 用反射方式獲得注解對(duì)應(yīng)的實(shí)例對(duì)象后,在通過(guò)該對(duì)象調(diào)用屬性對(duì)應(yīng)的方法* MyAnnotation是一個(gè)類,這個(gè)類的實(shí)例對(duì)象annotation是通過(guò)反射得到的,這個(gè)實(shí)例對(duì)象是如何創(chuàng)建的呢?* 一旦在某個(gè)類上使用了@MyAnnotation,那么這個(gè)MyAnnotation類的實(shí)例對(duì)象annotation就會(huì)被創(chuàng)建出來(lái)了*/MyAnnotation annotation = (MyAnnotation) MyAnnotationTest.class.getAnnotation(MyAnnotation.class);System.out.println("annotation.color():"+annotation.color());// 輸出color屬性的默認(rèn)值:redSystem.out.println("annotation.value():"+annotation.value());// 輸出value屬性的默認(rèn)值:testSystem.out.println("annotation.arrayAttr().length:"+annotation.arrayAttr().length);// 這里輸出的數(shù)組屬性的長(zhǎng)度的結(jié)果為:3,數(shù)組屬性有三個(gè)元素,因此數(shù)組的長(zhǎng)度為3System.out.println("annotation.lamp():"+annotation.lamp());// 這里輸出的枚舉屬性值為:GREENSystem.out.println("annotation.annotationAttr().value():"+annotation.annotationAttr().value());// 這里輸出的注解屬性值:gacl MetaAnnotation ma = annotation.annotationAttr();// annotation是MyAnnotation類的一個(gè)實(shí)例對(duì)象System.out.println("ma.value():"+ma.value());// 輸出的結(jié)果為:gacl }} }

    結(jié)果:

    annotation.color():red annotation.value():test annotation.arrayAttr().length:3 annotation.lamp():GREEN annotation.annotationAttr().value():gacl ma.value():gacl

    ?

    七、Java并發(fā)編程中,用到了一些專門為并發(fā)編程準(zhǔn)備的 Annotation

    主要包括三類:
    1、類 Annotation(注解)
    就像名字一樣,這些注解是針對(duì)類的。主有要以下三個(gè):

    • @Immutable
    • @ThreadSafe
    • @NotThreadSafe

    @Immutable 表示,類是不可變的,包含了 @ThreadSafe 的意思。
    @ThreadSafe 是表示這個(gè)類是線程安全的。具體是否真安全,那要看實(shí)現(xiàn)者怎么實(shí)現(xiàn)的了,反正打上這個(gè)標(biāo)簽只是表示一下。不線程安全的類打上這個(gè)注解也沒(méi)事兒。
    @NotThreadSafe 表示這個(gè)類不是線程安全的。如果是線程安全的非要打上這個(gè)注解,那也不會(huì)報(bào)錯(cuò)。

    這三個(gè)注解,對(duì)用戶和維護(hù)者是有益的,用戶可以立即看出來(lái)這個(gè)類是否是線程安全的,維護(hù)者則是可以根據(jù)這個(gè)注解,重點(diǎn)檢查線程安全方面。另外,代碼分析工具可能會(huì)利用這個(gè)注解。


    2、域 Annotation(注解)
    域注解是對(duì)類里面成員變量加的注解。


    3、方法 Annotation(注解)
    方法注解是對(duì)類里面方法加的注解。

    域注解和方法注解都是用@GuardedBy( lock )來(lái)標(biāo)識(shí)。里面的Lock是告訴維護(hù)者:這個(gè)狀態(tài)變量,這個(gè)方法被哪個(gè)鎖保護(hù)著。這樣可以強(qiáng)烈的提示類的維護(hù)者注意這里。

    @GuardedBy( lock )有以下幾種使用形式:

    1、@GuardedBy( "this" ) 受對(duì)象內(nèi)部鎖保護(hù)
    2、@GuardedBy( "fieldName" ) 受 與fieldName引用相關(guān)聯(lián)的鎖保護(hù)。
    3、@GuardedBy( "ClassName.fieldName" ) 受 一個(gè)類的靜態(tài)field的鎖保存。
    4、@GuardedBy( "methodName()" ) 鎖對(duì)象是 methodName() 方法的返值,受這個(gè)鎖保護(hù)。
    5、@GuardedBy( "ClassName.class" ) 受 ClassName類的直接鎖對(duì)象保護(hù)。而不是這個(gè)類的某個(gè)實(shí)例的鎖對(duì)象。

    八、servlet3.0的注解

    在最新的servlet3.0中引入了很多新的注解,尤其是和servlet安全相關(guān)的注解。

    HandlesTypes?–該注解用來(lái)表示一組傳遞給ServletContainerInitializer的應(yīng)用類。

    HttpConstraint?– 該注解代表所有HTTP方法的應(yīng)用請(qǐng)求的安全約束,和ServletSecurity注釋中定義的HttpMethodConstraint安全約束不同。

    HttpMethodConstraint?– 指明不同類型請(qǐng)求的安全約束,和ServletSecurity 注解中描述HTTP協(xié)議方法類型的注釋不同。

    MultipartConfig?–該注解標(biāo)注在Servlet上面,表示該Servlet希望處理的請(qǐng)求的 MIME 類型是 multipart/form-data。

    ServletSecurity?該注解標(biāo)注在Servlet繼承類上面,強(qiáng)制該HTTP協(xié)議請(qǐng)求遵循安全約束。

    WebFilter?– 該注解用來(lái)聲明一個(gè)Server過(guò)濾器;

    WebInitParam?– 該注解用來(lái)聲明Servlet或是過(guò)濾器的中的初始化參數(shù),通常配合 @WebServlet 或者 @WebFilter 使用。

    WebListener?–該注解為Web應(yīng)用程序上下文中不同類型的事件聲明監(jiān)聽器。

    WebServlet?–該注解用來(lái)聲明一個(gè)Servlet的配置。

    總結(jié)

    以上是生活随笔為你收集整理的Annotation之一:Java Annotation基本功能介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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