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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 注解 属性 类型_收藏!你一定要知道的Java8中的注解

發布時間:2023/12/2 java 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 注解 属性 类型_收藏!你一定要知道的Java8中的注解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

全文共3002字,預計學習時長6分鐘

海中有大量的注解!

JavaSE 1.5中首次引入了注解。Java注解的目的是允許程序員編寫關于其程序的元數據。在OracleDocs中,注解的定義是:“注解是元數據的一種形式,它提供的數據與程序本身無關。”

注解可以在代碼的任何地方使用,如在類、方法和變量中使用。從Java 8開始,它也可以用于類型聲明。

帶注解的代碼與程序沒有任何直接關系。只有其他程序或JVM可以使用這些信息來實現其目的。

注解的語法

注解是使用字符@和注解名(即@AnnotationName)來聲明的。當編譯器遍歷這個元素時,即可知道這是一個注解。例如:

@ExampleAnnotation

publicclass SampleClass {

}

上面的注解稱為ExampleAnnotation,用于注解類SampleClass。

注解可以有許多屬性。這些屬性會在聲明注解時以鍵-值對的形式給出。如:

@ExampleAnnotation(name = ”first name”, age = 35)

publicvoid simpleMethod() {

}

注意,這里的ExampleAnnotation是在注解一個方法。如果注解只有一個屬性,那么在聲明注解時可以跳過該屬性的名稱。舉例如下:

@ExampleAnnotation(“I am the only property”)

publicvoid simpleMethod() {

}

一個元素可以有多個注解。例如:

@Annotation1

@Annotation2(“Another Annotation”)

publicclass SimpleClass {

}

表J2SE 8;相同的注解可以多次用于一個元素,如:

@ExampleAnnotation(“Annotation used”)

@ExampleAnnotation(“Annotation repeated”)

publicclass SimpleClass {

}

這將在@Repeatable注解部分進行詳細討論。

Java中預定義的注解

Java附帶了一組預定義的注解。Java Core提供的注解如下:

@Retention:這個注解注解其他注解,并指示注解的范圍。可能的值包括:

  • SOURCE — 表示該注解只在源代碼中可用,編譯器和JVM會忽略它,因此在運行時不可用。
  • CLASS — 表示此注解對編譯器可用,但對JVM不可用,因此在運行時不可用。
  • RUNTIME —表示該注解對JVM可用,因此可以在運行時使用。

@Target: 該注解表示一個注解可以應用到的目標元素:

  • ANNOTATION_TYPE — 意味著可將該注解應用于其他注解。CONSTRUCTOR — 可以應用于構造函數。
  • FIELD — 可以應用于字段或屬性。
  • LOCAL_VARIABLE —可應用于局部字段。
  • METHOD— 可用于方法。
  • PACKAGE— 可用于程序包聲明。
  • PARAMETER — 可用于方法的參數。
  • TYPE — 可用于Class, Interface, Annotation, 或列舉聲明.
  • PACKAGE— 可應用于程序包聲明。
  • TYPE_PARAMETER — 可應用于類型參數聲明。
  • TYPE_USE — 可應用于任何類型。

@Documented:此注解可應用于其他注解。這意味著將使用Javadoc工具記錄帶注解的元素。

@Inherited:默認情況下,注解不會被子類繼承。但是如果一個注解被標記為@ inherated,這意味著當一個類被注解時,這個注解也會被子類繼承。此注解僅適用子類。注意,如果一個接口是用那個注解注解的,那么實現類不會繼承這個注解。

@Deprecated:指示不應使用帶注解的元素。此注解使編譯器生成警告消息,可以應用于方法、類和字段。

@SuppressWarnings:指示編譯器出于某種或某些特定原因不生成警告消息。

@Override: 該注解通知編譯器該元素正在重寫超類的一個元素。在重寫元素時不強制使用,但有助于編譯器在重寫未正確完成時生成出錯消息,例如,如果子類方法參數與超類參數不同,或者返回類型不匹配。

@SafeVarargs: 當應用到一個方法或構造方法時,代碼不會對可變參數執行潛在的不安全操作。

重復注解

此注解表明,使用此注解的注解可以多次應用于同一元素。

通過一個例子可以更清楚地理解這個概念。

若要使用這個注解,首先,我們需要定義一個注解,它可用于對類進行重復注解。

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.TYPE_USE)

@Repeatable (RepeatableAnnotationContainer.class)

public@interface RepeatableAnnotation() {

String values();

}

此處,RepeatableAnnotation是一個可重復用于注解一個元素的注解。

接下來,需要定義RepeatableAnnotationContainer注解類型。這基本上可稱之為注解類型的容器,它必須有RepeatableAnnotation注解類型的數組。

public@interfaceRepeatableAnnotationContainer {

RepeatableAnnotation [] value();

}

現在, Repeatable 注解可多次應用于任何元素。

@RepeatableAnnotation (“I am annotating the class”)

@RepeatableAnnotation (“I am annotating the class again”)

@RepeatableAnnotation (“I am annotating the class for the third time”)

public classRepeatedAnnotationExample {

}

接下來,要檢索程序中注解的值,首先要檢索容器的數組。數組的每個元素將包含一個值。如:

@RepeatableAnnotation (“I am annotating the class”)

@RepeatableAnnotation (“I am annotating the classagain”)

@RepeatableAnnotation(“I am annotating the classfor the third time”)

publicclassRepeatableAnnotationExample {

publicstaticvoid main(String [] args) {

Class object = RepeatableAnnotationExample.class

Annotation[] annotations = object.getAnnotations();

for (Annotation annotation : annotations) {

RepeatableAnnotationContainer rac = (RepeatableAnnotationContainer) annotation;

RepeatableAnnotation [] raArray = rac.value();

for (RepeatableAnnotation ra : raArray) {

System.out.println(ra.value);

}

}

}

}

當執行上述代碼時,輸出為:

I am annotating the class

Iamannotatingtheclassagain

Iamannotatingtheclassfor the third time.

類型注解

Java8發布之后,注解可以應用于任何類型的使用。這意味著可在任何使用類型的地方使用注解。例如,當使用新的操作符、類型轉換創建類實例時,當使用執行子句、拋出子句等實現接口時,這種形式的注解稱為類型注解。

這種類型注解的目的是支持改進的Java程序分析,并確保更強的類型檢查。在Java 8發布之前,Java不包含類型檢查框架,但是可使用類型注解在Java程序中編寫和使用類型檢查框架。

例如,假設我們希望在整個程序中都不將某個特定變量賦值為null。我們可以編寫一個自定義插件NonNull來檢查這個并使用自定義注解注解那個特定的變量。變量聲明應該是:

@NonNullString notNullString;

在編譯代碼時,編譯器會檢查潛在的問題,并在可能為變量賦空值的地方發現任何此類代碼時發出警告。

自定義注解

Java允許程序員定義和實現自定義注解。定義自定義注解的語法如下:

public@interfaceCustomAnnotation { }

這將創建一個名為CustomAnnotation的新注解類型。@interface關鍵字用于定義自定義注解。

在定義自定義注解時,必須為該注解定義兩個強制屬性。盡管這里還可以定義其他屬性,但這兩個屬性最為重要,而且是必需的。這兩個屬性分別是Retention Policy 和 Target.。

這兩個屬性以自定義注解的形式聲明。另外,可以在定義自定義注解時定義注解屬性。如:

@Retention (RetentionPolicy.RUNTIME)

@Target (ElementType.ELEMENT)

public@interfaceCustomAnnotation {

publicString name() default “Mr Bean”;

publicString dateOfBirth();

}

上述自定義注解中,RetentionPolicy是RUNTIME,這意味著它在運行時對JVM可用,目標是ELEMENT,且可被注解為任何元素類型。

另外,它還有兩個屬性:一個是帶有缺省值的MrBean,另一個是沒有缺省值的dateOfBirth。

注意,聲明為方法的屬性沒有任何參數和拋出子句。此外,返回類型僅限于所述返回類型的字符串、類、枚舉、注解和數組。

現在,可通過以下方式使用自定義注解:

@CustomAnnotation (dateOfBirth = “1980-06-25”)

public class CustomAnnotatedClass {

}

類似地,可以使用@Target (ElementType.METHOD)注解創建方法的自定義注解,并可用于注解任何方法。

檢索注解及其屬性

Java Reflection API包含幾個方法,可用于在運行時從類、方法和其他元素中檢索注解。包含所有這些方法的接口是 AnnotatedElement。最重要的是:

  • getAnnotations(): 返回給定元素的所有注解,以及元素定義中未顯式定義的注解。
  • isAnnotationPresent(annotation):檢查傳遞的注解在當前元素中是否可用。
  • getAnnotation(class): 檢索作為參數傳遞的特定注解。如果給定元素沒有此注解,則返回null。

該類由java.lang.Class,java.lang.reflect.Method,和java.lang.reflect.Field,實現。
因此,它基本上可以與任何類型的Java元素一起使用。

下面的程序演示了獲得已定義的自定義注解的信息方法:

publicstaticvoidmain(String [] args) {

Class object = CustomAnnotatedClass.class;

// Retrieve all annotations from the class

Annotation[] annotations = object.getAnnotations();

for( Annotation annotation : annotations ) {

System.out.println(annotation);

}

// Checks if an annotation is present

if( object.isAnnotationPresent( CustomAnnotationClass.class ) ) {

// Gets the desired annotation

Annotation annotation = object.getAnnotation(CustomAnnotationClass.class) ;

System.out.println(annotation);

}

// fetch the attributes of the annotation

for(Annotation annotation : annotations) {

System.out.println(“name: “ + annotation.name());

System.out.println(“Date of Birth: “+ annotation.dateOfBirth());

}

// the same for all methods of the class

for( Method method : object.getDeclaredMethods() ) {

if( method.isAnnotationPresent( CustomAnnotationMethod.class ) ) {

Annotation annotation = method.getAnnotation(CustomAnnotationMethod.class );

System.out.println( annotation );

}

}

}

結論

現如今,在使用J2EE堆棧來開發企業應用程序時,注解已逐漸成為這一過程中至關重要的一部分。現在,幾乎所有常見的代碼庫都使用注解來實現不同目的,如代碼質量分析、單元測試、XML解析、依賴注入等。此外,還有一些常用代碼庫也廣泛使用到了注解,包括Junit、Hibernate、Spring MVC、Findbugs、JAXB和Junit。

留言點贊關注

我們一起分享AI學習與發展的干貨

如轉載,請后臺留言,遵守轉載規范

總結

以上是生活随笔為你收集整理的java 注解 属性 类型_收藏!你一定要知道的Java8中的注解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。