Java語(yǔ)言使用@interface
語(yǔ)法來(lái)定義注解(Annotation
),它的格式如下:
public @interface Report {
int type() default 211;
String level() default "211";
String value() default "211";
}
?注解的參數(shù)類似無(wú)參數(shù)方法,可以用default
設(shè)定一個(gè)默認(rèn)值(強(qiáng)烈推薦)。最常用的參數(shù)應(yīng)當(dāng)命名為value
。
元注解
有一些注解可以修飾其他注解,這些注解就稱為元注解(meta annotation)。Java標(biāo)準(zhǔn)庫(kù)已經(jīng)定義了一些元注解,我們只需要使用元注解,通常不需要自己去編寫元注解。
@Target
最常用的元注解是@Target
。使用@Target
可以定義Annotation
能夠被應(yīng)用于源碼的哪些位置:
- 類或接口:
ElementType.TYPE
; - 字段:
ElementType.FIELD
; - 方法:
ElementType.METHOD
; - 構(gòu)造方法:
ElementType.CONSTRUCTOR
; - 方法參數(shù):
ElementType.PARAMETER
。
例如,要使 注解@Report
可用在方法上,我們必須添加一個(gè)@Target(ElementType.METHOD)
:
@Target(ElementType.METHOD)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
//@Target(ElementType.METHOD) 表明注解Report 可以放在 類的方法前
定義注解@Report
可用在方法或字段上,可以把@Target
注解參數(shù)變?yōu)?/strong>數(shù)組{ ElementType.METHOD, ElementType.FIELD }
:
@Target({
ElementType.METHOD,
ElementType.FIELD
})
public @interface Report {
...
}
@Retention
另一個(gè)重要的元注解@Retention
定義了Annotation
的生命周期:
-
僅編譯期:
RetentionPolicy.SOURCE
; -
僅class文件:
RetentionPolicy.CLASS
; - 運(yùn)行期:
RetentionPolicy.RUNTIME
。
如果@Retention
不存在,則該Annotation
默認(rèn)為CLASS
。因?yàn)橥ǔN覀冏远x的Annotation
都是RUNTIME
,所以,務(wù)必要加上@Retention(RetentionPolicy.RUNTIME)
這個(gè)元注解:
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
@Repeatable
使用@Repeatable
這個(gè)元注解可以定義Annotation
是否可重復(fù)。這個(gè)注解應(yīng)用不是特別廣泛。
@Repeatable(Reports.class)
@Target(ElementType.TYPE)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
@Target(ElementType.TYPE)
public @interface Reports {
Report[] value();
}
經(jīng)過(guò)@Repeatable
修飾后,在某個(gè)類型聲明處,就可以添加多個(gè)@Report
注解:
@Report(type=1, level="debug")
@Report(type=2, level="warning")
public class Hello {
}
@Inherited
使用@Inherited
定義子類是否可繼承父類定義的Annotation
。@Inherited
僅針對(duì)@Target(ElementType.TYPE)
類型的annotation
有效,并且僅針對(duì)class
的繼承,對(duì)interface
的繼承無(wú)效:
@Inherited
@Target(ElementType.TYPE)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
//Report注解 可以放在 類定義的前面 且父類有Report注解的話,
可被子類繼承該注解
在使用的時(shí)候,如果一個(gè)類用到了@Report
:
@Report(type=1)
public class Person {
}
則它的子類默認(rèn)也定義了該注解:
public class Student extends Person {
}
如何定義Annotation
我們總結(jié)一下定義Annotation
的步驟:
第一步,用@interface
定義注解:
public @interface Report {
}
第二步,添加參數(shù)、默認(rèn)值:
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
把最常用的參數(shù)定義為value()
,推薦所有參數(shù)都盡量設(shè)置默認(rèn)值。
第三步,用元注解配置注解:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
int type() default 0;
String level() default "info";
String value() default "";
}
其中,必須設(shè)置@Target
和@Retention
,@Retention
一般設(shè)置為RUNTIME
,因?yàn)槲覀冏远x的注解通常要求在運(yùn)行期讀取。一般情況下,不必寫@Inherited
和@Repeatable
。
(Target元注解 表明定義的注解能放什么位置;Retention元注解 表明定義的注解的生命周期)
小結(jié)
Java使用@interface
定義注解:
可定義多個(gè)參數(shù)和默認(rèn)值,核心參數(shù)使用value
名稱;
必須設(shè)置@Target
來(lái)指定Annotation
可以應(yīng)用的范圍;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-453593.html
應(yīng)當(dāng)設(shè)置@Retention(RetentionPolicy.RUNTIME)
便于運(yùn)行期讀取該Annotation
。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-453593.html
到了這里,關(guān)于Java|注解之定義注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!