Java註解(1)-註解基礎
註解(Annotation)是在JAVA5中開始引入的,它為在代碼中添加信息提供了一種新的方式。註解在一定程度上把元數據與源代碼文件結合在一起,正如許多成熟的框架(Spring)所做的那樣。那麽,註解到底可以做什麽呢?
1、註解的作用。
- 提供用來完整地描述程序所需要的信息,如編譯期校驗程序信息。
- 生成描述符文件,或生成新類的定義。
- 減輕編寫“樣板”代碼(配置文件)的負擔,可以使用註解自動生成。
- 更加幹凈易讀的代碼。
- 編譯期類型檢查。
2、Java提供的註解
Java5內置了一些原生的註解,它們僅次於java.lang包下(不止於此):
- @Override,表示當前的方法定義將覆蓋超類中的方法。
- @Deprecated,標識元素為棄用的,如果程序員使用了註解為它的元素,編譯器會發出警告信息。
- @SuppressWarnings,關閉不當的編譯器警告信息。
以上註解均為源碼級別註解(即為RetentionPolicy.SOURCE標註,需要註意的是,雖然@Deprecated是由RetentionPolicy.CLASS標註,但是所起的作用主要還是在編譯期),僅編譯器可讀取,編譯成class將會舍棄,當然,運行時就更不會存在了。
Java還提供了一些元註解,用於自定義註解(meta-annotations),如@Target、@Retention、@SupportedSourceVersion等。java.lang.annotation包中的元註解:
@Retention 指定標識的註解如何保存。
RetentionPolicy.SOURCE
– 註解將僅保存在源代碼級別,將會被編譯器丟棄。RetentionPolicy.CLASS
– 將會在編譯時期使用,並保存在class中,但JVM不會識別此。RetentionPolicy.RUNTIME
– 此註解將會被JVM識別,理論上將會在任意時期都會存在。
@Documented 表明該註解標識的元素所使用的註解應該出現在javadoc中。
@Target 指定哪種JAVA元素可以使用當前定義的註解,指定類型(ElementType)如下:
ElementType.ANNOTATION_TYPE
ElementType.CONSTRUCTOR
構造方法聲明。ElementType.FIELD
字段聲明(包括枚舉常量)。ElementType.LOCAL_VARIABLE
局部變量聲明。ElementType.METHOD
方法聲明。ElementType.PACKAGE
包聲明。ElementType.PARAMETER
參數聲明。ElementType.TYPE
類、接口(包括註釋類型)或枚舉聲明。
@Inherited 指示註釋類型被自動繼承。如果在註釋類型聲明中存在 Inherited 元註釋,並且用戶在某一類聲明中查詢該註釋類型,同時該類聲明中沒有此類型的註釋,則將在該類的超類中自動查詢該註釋類型。此過程會重復進行,直到找到此類型的註釋或到達了該類層次結構的頂層 (Object) 為止。如果沒有超類具有該類型的註釋,則查詢將指示當前類沒有這樣的註釋。
註意,如果使用註釋類型註釋類以外的任何事物,此元註釋類型都是無效的。還要註意,此元註釋僅促成從超類繼承註釋;對已實現接口的註釋無效。
@Repeatable (Java8中增加)使用此註解註釋的註解,在使用時是可重復使用的。註意,在Java8之前註解同一個註解在同一個元素上是不可以多次使用的。
3、定義註解
大多數時候,開發者需要自己定義註解以滿足不同的需求。
定義註解,註解一般包括註解的定義、註解元素、元註解,示例如下:
package com.zenfery.example.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target (ElementType.TYPE)
@Retention (RetentionPolicy.CLASS)
public @interface ClassInfo {
String value() default "default" ;
}
|
3.1、註解的定義
使用關鍵字@interface來定義,如上public @interface ClassInfo,註解的權限限定符僅支持public、default(包訪問權限)。
3.2、元註解
如上@Target(ElementType.TYPE),表示註解ClassInfo可用於類、接口、或者枚舉類型。
3.3、註解元素
註解元素使用類似普通方法的定義格式,如上述例子中的value(),使用default指定默認值。註解元素在使用時必須有值,要麽是默認值,要麽在使用註解是提供元素的值。且註解元素的值不能為null值。
註解元素的可用類型有:所有的基本類型、String、Class、enum、Annotation、以上類型的數組。如果使用復雜類型的註解,可使用註解的嵌套來實現。如果程序員的註解中定義了名為value的元素,並且在應用該註解的時候,如果該元素是唯一需要賦值的一個元素,那麽此時無需使用名-值對的語法,而只需在括號內給出value元素所需的值即可。
3.4、註解不支持繼承
不可使用extends關鍵字繼承某個@interface。可以使用嵌套來實現相似的功能。
4、註解的使用
如果要使用以上的註解,可像如下這種方式使用:
package com.zenfery.example.annotation.clazz;
import com.zenfery.example.annotation.ClassInfo;
@ClassInfo ( "這是HelloAnnotation類。" )
public class HelloAnnotation {
}
|
轉載請註明:子暃之路 ? Java註解(1)-註解基礎
Java註解(1)-註解基礎