您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java 8注解語法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java 8注解語法有哪些”吧!
注解語法
注解由字符 @ 和注解名組成,即 @AnnotationName。當編譯器發現這個語法該元素時,會把它解析為注解。例如:
@ExampleAnnotation
public class SampleClass {
}
上面的注解稱為 ExampleAnnotation,標記在 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 部分會對此進行詳細地討論。
Java 預定義注解
Java 支持一組預先定義好的注解。下面介紹了Java Core 中提供的注解:
@Retention:
SOURCE:注解僅在源代碼中可用。編譯器和 JVM 會忽略此注解,因此在運行時不可用;
CLASS:編譯器會處理該注解,但 JVM 不會處理,因此在運行時不可用;
RUNTIME:JVM 會處理該注解,可以在運行時使用。
@Target:
ANNOTATION_TYPE:可修飾其他注解;
CONSTRUCTOR:可以修飾構造函數;
FIELD:可以修飾字段或屬性;
LOCAL_VARIABLE:可以修飾局部變量;
METHOD:可以修飾 method;
PACKAGE:可以修飾 package 聲明;
PARAMETER:可以修飾方法參數;
TYPE:可以修飾 Class、Interface、Annotation 或 enum 聲明;
PACKAGE:可以修飾 package 聲明;
TYPE_PARAMETER:可以修飾參數聲明;
TYPE_USE:可以修飾任何類型。
@Documented:@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE_USE)
@Repeatable (RepeatableAnnotationContainer.class)
public @interface
RepeatableAnnotation() {
String
values();
}
RepeatableAnnotation可以重復修飾元素。
接下來,定義 RepeatableAnnotationContainer注解類型。這是一個注解類型容器,包含一個 RepeatableAnnotation 類型的數組。
public @interface RepeatableAnnotationContainer {
RepeatableAnnotation [] value();
}
現在,Repeatable 可以元素進行多次注釋。
@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}
在程序中要獲取注解中的值,先要獲取容器中的數組,數組的每個元素將包含一個值。例如:
@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);
}
}
}
}
執行結果:
I am annotating the
class
I am annotating the
class again
I am annotating the
class for the third time.
類型注解
Java 8發布后,注解可以用于任何類型(Type),這意味著只要可以使用類型的地方就能使用注解。例如,使用新運算符創建類實例、類型轉換、用 implements 實現接口、拋出異常等,這種注解稱為類型注解。
這種注解能夠幫助分析與改進 Java 程序,提供更強大的類型檢查。Java 8發布前,Java 沒有提供類型檢查框架。但是通過類型注解可以開發類型檢查框架,對 Java 程序進行檢查。
舉例來說,假設我們希望特定變量在程序執行過程中始終不為 null。可以編寫一個自定義插件 NonNull,并為特定變量加上該注解進行檢查。變量聲明如下:
@NonNull String notNullString;
編譯代碼時,如果發現任何可能將變量賦值為 null 的代碼,編譯器會檢查潛在問題并給出告警。
自定義注解
Java 允許程序員自定義注解。自行定義注解的語法:
public @interface CustomAnnotation { }
上面的代碼會創建一個 CustomAnnotation新注解。@Interface 關鍵字可用于自定義注解。
自定義注解時,必須設置兩個必填屬性。可以在定義中增加其他屬性,但這兩個重要屬性是必需的,即@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.ELEMENT)
public @interface CustomAnnotation {
public String
name() default “Mr Bean”;
public String
dateOfBirth();
}
上面的自定義注解中,Retention Policy 為 RUNTIME,這表明該注解可以在 JVM 運行時使用;Target 設為 ELEMENT,表示該注解可以修飾任何元素與類型。
此外,它還具有兩個屬性:name 與 dateOfBirth。其中,name 屬性默認值為 Mr Bean, dateOfBirth 沒有默認值。
注意,聲明的 Method 沒有帶任何參數以及 throws 語句。此外,返回類型僅限于 String、class、enum、注解以及上述類型的數組。
現在,可以像下面這樣使用自定義注解:
@CustomAnnotation (dateOfBirth = “1980-06-25”)
public class CustomAnnotatedClass {
}
同樣,可以使用 @Target(ElementType.METHOD) 創建自定義注解修飾 method。
獲取注解及屬性
Java Reflection API 提供了幾種方法,可以在運行時中從 class、method 和其他元素中獲取注解。
AnnotatedElement接口定義了所有的方法,其中最重要的一個是:
getAnnotations(): 返回指定元素的所有注解,包括定義元素時未明確寫出的注解。
isAnnotationPresent(annotation): 檢查注解在當前元素上是否可用。
getAnnotation(class): 獲取 class 參數使用的注解,如果參數不存在注解返回 null。
這個 class 支持 java.lang.Class、java.lang.reflect.Method 和 java.lang.reflect.Field,基本上可以適用任何的 Java 元素。
下面的示例程序展示了如何獲取自定義注解的相關信息:
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());
}
// 對所有方法執行相同的操作
for( Method method : object.getDeclaredMethods() ) {
if( method.isAnnotationPresent( CustomAnnotationMethod.class ) ) {
Annotation annotation = method.getAnnotation(CustomAnnotationMethod.class );
System.out.println( annotation );
}
}
}
感謝各位的閱讀,以上就是“Java 8注解語法有哪些”的內容了,經過本文的學習后,相信大家對Java 8注解語法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。