您好,登錄后才能下訂單哦!
這篇文章主要講解了“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)注!
免責(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)容。