溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java 8注解語法有哪些

發(fā)布時間:2021-12-21 16:53:25 來源:億速云 閱讀:176 作者:iii 欄目:編程語言

這篇文章主要講解了“Java 8注解語法有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java 8注解語法有哪些”吧!

注解語法

注解由字符 @ 和注解名組成,即 @AnnotationName。當(dāng)編譯器發(fā)現(xiàn)這個語法該元素時,會把它解析為注解。例如:

@ExampleAnnotation
public class SampleClass {
}

上面的注解稱為 ExampleAnnotation,標(biāo)記在 SampleClass 上。

注解可以包含屬性,在聲明注解時以鍵值對的形式給出。例如: 

@ExampleAnnotation(name = ”first name”, age = 
35)
public void simpleMethod() {
}

請注意,這里 ExampleAnnotation 是一個方法注解。如果注解只包含一個屬性,在聲明注解時可以忽略屬性名。示例如下:

@ExampleAnnotation(“I am the only property”)
public void simpleMethod() {
}

一個元素可以使用多個注解。比如下面這個示例:

@Annotation1
@Annotation2(“Another Annotation”)
public class SimpleClass {
}

從 J2SE 8 開始,可以為同一個元素多次使用相同的注解,例如:

@ExampleAnnotation(“Annotation used”)
@ExampleAnnotation(“Annotation repeated”)
public class SimpleClass {
}

在 @Repeatable 部分會對此進(jìn)行詳細(xì)地討論。

Java 預(yù)定義注解

Java 支持一組預(yù)先定義好的注解。下面介紹了Java Core 中提供的注解:

@Retention:

  • SOURCE:注解僅在源代碼中可用。編譯器和 JVM 會忽略此注解,因此在運行時不可用;

  • CLASS:編譯器會處理該注解,但 JVM 不會處理,因此在運行時不可用;

  • RUNTIME:JVM 會處理該注解,可以在運行時使用。

@Target:

  • ANNOTATION_TYPE:可修飾其他注解;

  • CONSTRUCTOR:可以修飾構(gòu)造函數(shù);

  • FIELD:可以修飾字段或?qū)傩裕?/p>

  • LOCAL_VARIABLE:可以修飾局部變量;

  • METHOD:可以修飾 method;

  • PACKAGE:可以修飾 package 聲明;

  • PARAMETER:可以修飾方法參數(shù);

  • TYPE:可以修飾 Class、Interface、Annotation 或 enum 聲明;

  • PACKAGE:可以修飾 package 聲明;

  • TYPE_PARAMETER:可以修飾參數(shù)聲明;

  • TYPE_USE:可以修飾任何類型。

@Documented:@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE_USE)
@Repeatable (RepeatableAnnotationContainer.class)
public @interface RepeatableAnnotation() {
   String values();
}

RepeatableAnnotation可以重復(fù)修飾元素。

接下來,定義 RepeatableAnnotationContainer注解類型。這是一個注解類型容器,包含一個 RepeatableAnnotation 類型的數(shù)組。

public @interface RepeatableAnnotationContainer {
   RepeatableAnnotation [] value();
}

現(xiàn)在,Repeatable 可以元素進(jìn)行多次注釋。

@RepeatableAnnotation (“I am annotating the class”)
@RepeatableAnnotation (“I am annotating the class again”)
@RepeatableAnnotation (“I am annotating the classfor the third time”)
publicclass RepeatedAnnotationExample {function(){   //外匯跟單www.gendan5.com}

在程序中要獲取注解中的值,先要獲取容器中的數(shù)組,數(shù)組的每個元素將包含一個值。例如:

@RepeatableAnnotation (“I am annotating the 
class”)
@RepeatableAnnotation (“I am annotating the class again”)
@RepeatableAnnotation(“I am annotating the class for the third time”)
public class RepeatableAnnotationExample {
   public static void 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);
   }
}
}
}

執(zhí)行結(jié)果:

I am annotating the 
class
I am annotating the class again
I am annotating the class for the third time.

類型注解

Java 8發(fā)布后,注解可以用于任何類型(Type),這意味著只要可以使用類型的地方就能使用注解。例如,使用新運算符創(chuàng)建類實例、類型轉(zhuǎn)換、用 implements 實現(xiàn)接口、拋出異常等,這種注解稱為類型注解。 

這種注解能夠幫助分析與改進(jìn) Java 程序,提供更強大的類型檢查。Java 8發(fā)布前,Java 沒有提供類型檢查框架。但是通過類型注解可以開發(fā)類型檢查框架,對 Java 程序進(jìn)行檢查。

舉例來說,假設(shè)我們希望特定變量在程序執(zhí)行過程中始終不為 null??梢跃帉懸粋€自定義插件 NonNull,并為特定變量加上該注解進(jìn)行檢查。變量聲明如下:

@NonNull String notNullString;

編譯代碼時,如果發(fā)現(xiàn)任何可能將變量賦值為 null 的代碼,編譯器會檢查潛在問題并給出告警。

自定義注解

Java 允許程序員自定義注解。自行定義注解的語法:

public @interface CustomAnnotation { }

上面的代碼會創(chuàng)建一個 CustomAnnotation新注解。@Interface 關(guān)鍵字可用于自定義注解。

自定義注解時,必須設(shè)置兩個必填屬性。可以在定義中增加其他屬性,但這兩個重要屬性是必需的,即@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.ELEMENT)
public @interface CustomAnnotation {
   public String name() default “Mr Bean”;
   public String dateOfBirth();
}

上面的自定義注解中,Retention Policy 為 RUNTIME,這表明該注解可以在 JVM 運行時使用;Target 設(shè)為 ELEMENT,表示該注解可以修飾任何元素與類型。 

此外,它還具有兩個屬性:name 與 dateOfBirth。其中,name 屬性默認(rèn)值為 Mr Bean, dateOfBirth 沒有默認(rèn)值。

注意,聲明的 Method 沒有帶任何參數(shù)以及 throws 語句。此外,返回類型僅限于 String、class、enum、注解以及上述類型的數(shù)組。

現(xiàn)在,可以像下面這樣使用自定義注解:

@CustomAnnotation (dateOfBirth = “1980-06-25”)
public class CustomAnnotatedClass {
}

同樣,可以使用 @Target(ElementType.METHOD) 創(chuàng)建自定義注解修飾 method。

獲取注解及屬性

Java Reflection API 提供了幾種方法,可以在運行時中從 class、method 和其他元素中獲取注解。 

AnnotatedElement接口定義了所有的方法,其中最重要的一個是:

  • getAnnotations(): 返回指定元素的所有注解,包括定義元素時未明確寫出的注解。

  • isAnnotationPresent(annotation): 檢查注解在當(dāng)前元素上是否可用。

  • getAnnotation(class): 獲取 class 參數(shù)使用的注解,如果參數(shù)不存在注解返回 null。

這個 class 支持 java.lang.Class、java.lang.reflect.Method 和 java.lang.reflect.Field,基本上可以適用任何的 Java 元素。

下面的示例程序展示了如何獲取自定義注解的相關(guān)信息:

public static void main(String [] args) {
Class object = CustomAnnotatedClass.class;
// 從類中獲取所有注解
Annotation[] annotations = object.getAnnotations();
for( Annotation annotation : annotations ) {
System.out.println(annotation);
}
// 檢查是否存在注解
if( object.isAnnotationPresent( CustomAnnotationClass.class ) ) {
// 獲取需要的注解
Annotation annotation = object.getAnnotation(CustomAnnotationClass.class) ;
System.out.println(annotation);
}
// 獲取注解屬性
for(Annotation annotation : annotations) {
System.out.println(“name: “ + annotation.name());
System.out.println(“Date of Birth: “+ annotation.dateOfBirth());
}
// 對所有方法執(zhí)行相同的操作
for( Method method : object.getDeclaredMethods() ) {
if( method.isAnnotationPresent( CustomAnnotationMethod.class ) ) {
Annotation annotation = method.getAnnotation(CustomAnnotationMethod.class );
System.out.println( annotation );
}
}
}

感謝各位的閱讀,以上就是“Java 8注解語法有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java 8注解語法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI