在Java中的注解允許將元數(shù)據(jù)與程序元素相關(guān)聯(lián)。
程序元素可以是包,類,接口,類的字段,局部變量,方法,方法的參數(shù),枚舉,注解,通用類型/方法聲明中的類型參數(shù)等等。
可以在Java程序中注解任何聲明或類型。注解在任何其他修飾符(public,private,final,static等)的程序元素的聲明中用作修飾符。與修飾符不同,注解不會(huì)修改程序元素的含義。它是程序元素的注解。
聲明注解類型類似于聲明接口類型。注解類型是一種特殊類型的接口類型。使用前面帶有@符號(hào)的interface關(guān)鍵字來(lái)聲明注解類型(注意與聲明接口的區(qū)別)。
以下是聲明注解類型的一般語(yǔ)法:
<modifiers> @interface <annotation-type-name> { // Annotation type body }
注解聲明的<modifiers>修辭符與接口聲明的相同??梢詫⒆⒔忸愋吐暶鳛閜ublic或package級(jí)別。@符號(hào)與interface關(guān)鍵字之間可以用空格分隔,也可以連接在一起。按照慣例,它們一般是連接放在一起,如:@interface。interface關(guān)鍵字后面是注解類型名稱。 它應(yīng)該是有效的Java標(biāo)識(shí)符。
注解類型正文放在大括號(hào)中。以下代碼創(chuàng)建注解以使用版本信息注解程序元素。
public @interface Version { int major(); int minor(); }
在上面代碼中的Version注解類型中聲明了兩個(gè)抽象方法:major()和minor()。注解類型中的抽象方法稱為元素。注解可以聲明零個(gè)或多個(gè)元素,它們被聲明為抽象方法。抽象方法名稱是注解類型的元素的名稱。
在上面的代碼中,Version注解類型聲明了兩個(gè)元素:major和minor。 兩個(gè)元素的數(shù)據(jù)類型都是int。
如果要導(dǎo)入一個(gè)注解類型,那么它應(yīng)該就像導(dǎo)入任何其他類型一樣。
要?jiǎng)?chuàng)建注解類型的實(shí)例并使用它來(lái)注解程序元素,使用以下語(yǔ)法:
@annotationType(name1=value1, name2=value2, names3=values3...)
注解類型前面帶有一個(gè)@符號(hào),后面是用括號(hào)括起來(lái)的逗號(hào)分隔的name = value對(duì)列表。name = value對(duì)中的名稱是在注解類型中聲明的元素的名稱和值,它由用戶提供。name = value對(duì)不必按照在注釋類型中聲明的順序出現(xiàn)。
以下代碼使用Version類型的注解,主要元素值設(shè)置為1(major=1),次要元素值設(shè)置為0(minor=0)。
@Version(major=1, minor=0)
也可以使用注釋類型的完全限定名,如下代碼 -
@com.java2s.annotation.Version(major=0, minor=1)
可以將類聲明注釋為 -
@Version(major=1, minor=0) public class VersionTest { }
可以將程序元素的注釋與其他修飾符混合使用。
@Version(major=1, minor=0) public class VersionTest { } public @Version(major=1, minor=0) class VersionTest { }
完整的源代碼
@interface Version { int major(); int minor(); } @Version(major = 1, minor = 0) public class Main { @Version(major = 1, minor = 1) private int xyz = 110; @Version(major = 1, minor = 0) public Main() { } @Version(major = 1, minor = 1) public Main(int xyz) { this.xyz = xyz; } @Version(major = 1, minor = 0) public void printData() { } @Version(major = 1, minor = 1) public void setXyz(int xyz) { @Version(major = 1, minor = 2) int newValue = xyz; this.xyz = xyz; } }