前言
(1)Java實現(xiàn)自定義注解其實很簡單,跟類定義差不多,只是屬性的定義可能跟我們平時定義的屬性略有不同,這里會給大家詳解,先來看代碼:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
String message() default "";
int[] nums();
}
上面代碼就實現(xiàn)了一個自定義注解,實現(xiàn)自定義注解需要最少指定兩個基本條件:①注解的作用范圍②注解的生命周期,那這兩個范圍怎么指定呢?這個問題問的很好,指定這兩個條件,就需要使用到了Java為我們提供的元注解(所謂的元注解:其實就是Java官網(wǎng)自己定義的注解,作用在注解上,并且為這個注解賦予了含義,當(dāng)編譯器掃描到這個注解時,就知道該注解是什么作用?。?/p>
(2)看到這里要注意的是,上面 message() 和 nums()? 可能跟我們定義方法有點類似,但是,它不是方法!它不是方法!它不是方法!重要的事情講三遍,它是java注解自定義屬性的規(guī)則!(可能很多人疑惑也就是在這個點上?。?/strong>
? ? String message() default "";
上面表示的是定義一個 String 類型的 message屬性,默認(rèn)值為 ""
注解自定義屬性的格式為: 屬性類型 屬性名稱();
其中默認(rèn)值可以寫可以不寫,如果需要給這個屬性默認(rèn)值,那么就使用 default 值 來為這個屬性賦予默認(rèn)值。這樣就已經(jīng)完成了自定義注解。
(3)剛才我們說過,需要自定義注解,最少指定兩個基本條件:①注解的作用范圍②注解的生命周期,那么就需要用到元注解,Java為我們提供了四個元注解,作用如下:
注解 | 作用 |
---|---|
@Target | 指定注解作用范圍(比如說:該注解是作用在類上,還是方法,或者是屬性上等等) |
@Retention | 指定注解的生命周期(也就是注解的保留時間,是在編譯器有效,還是運行時有效等等) |
@Documented | 是一個標(biāo)記注解,里面沒有任何屬性,用 @Documented 注解修飾的注解類會被 JavaDoc 工具提取成文檔。(不常用,可選項) |
@Inherited | 也是一個標(biāo)記注解,,沒有定義屬性,作用是為了表示該注解可以被繼承(比如說:你自定義了一個A注解,并且使用了@Inherited修飾,然后在paren類使用了A注解,那么paren的所有子類都默認(rèn)繼承了注解A)?!静怀S谩?/td> |
4)帶大家看一下源碼,看一下這幾個元注解分別定義了哪些屬性,并且有什么值:
?①Target注解
可以看到,Target注解只是定義了一個Value屬性,屬性類型為 ElementType,來看一下ElementType有哪些值
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration */
TYPE, //作用于類、接口、枚舉
/** Field declaration (includes enum constants) */
FIELD, //作用在字段上
/** Method declaration */
METHOD, //作用在方法
/** Formal parameter declaration */
PARAMETER, //形參
/** Constructor declaration */
CONSTRUCTOR, //構(gòu)造器
/** Local variable declaration */
LOCAL_VARIABLE, //局部變量
/** Annotation type declaration */
ANNOTATION_TYPE, //注解類型聲明
/** Package declaration */
PACKAGE, //包聲明
/**
* Type parameter declaration
*
* @since 1.8
*/
TYPE_PARAMETER, //類型參數(shù)化的聲明
/**
* Use of a type
*
* @since 1.8
*/
TYPE_USE, //把該注解當(dāng)做一個類型來使用
/**
* Module declaration.
*
* @since 9
*/
MODULE
}
?@Retention
?Retention也是只定義了一個value屬性,該屬性類型為: RetentionPolicy,我們再一起看看Retention有哪些值可以選擇:
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
*/
SOURCE, //表示該注解的生命周期只在編譯階段
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
*/
CLASS, //該注解被保留在class文件上
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME //該注解生命周期在運行時
}
@Documented
可以看到,Documented注解只是一個標(biāo)記注解,里面什么屬性都沒有聲明,作用是:使用了該注解的類,會被 doc工具提取成參考文檔
@Inherited
?這個注解也是一個標(biāo)記注解,表示該注解是可以被繼承的文章來源:http://www.zghlxwxcb.cn/news/detail-418543.html
總結(jié)
以上就是Java注解自定義的全部過程了,注解出現(xiàn)為開發(fā)人員提供了很大的便利,從以前spring工程需要繁瑣復(fù)雜的xml各種配置,到現(xiàn)在只需要在類上添加注解,其中的對比一用可知,這里的注解也可以充當(dāng)理解為就是一個標(biāo)識符,比如說在類上使用 @Component,那么springBoot容器啟動的時候就可以知道該類需要加載到容器中。文章來源地址http://www.zghlxwxcb.cn/news/detail-418543.html
到了這里,關(guān)于Java實現(xiàn)自定義注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!