大家好,欢迎来到IT知识分享网。
元注解的概念
元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其他的注解上面。
元注解主要有 @Retention、@Documented、@Target、@Inherited、@Repeatable。
元注解@Retention
@Retention应用到一个注解上用于说明该注解的生命周期,取值如下:
1、RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译阶段进行编译时它将被丢弃忽视。
2、RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到JVM中,“默认方式”。
3、RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到JVM中,所以在程序运行时可以获取到它们。
package com.lagou.task10; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; // @Retention(RetentionPolicy.SOURCE) // 表示下面注解在源代码中有效 // @Retention(RetentionPolicy.CLASS) // 表示下面的注解在字节码文件中有效,默认方式 @Retention(RetentionPolicy.RUNTIME) // 表示下面的注解在运行时有效 public @interface MyAnnotation { public String value() default "默认值";
}
元注解@Documented
使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个源代码配套的API帮助文档,而该工具抽取时默认不包括注释内容。
@Documented用于指定被该注解将被javadoc工具提取文档。
定义为@Documented的注解必须设置Retention值为RUNTIME。
package com.lagou.task10; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) // 表示下面的注解在运行时有效 @Documented // 表示下面的注解信息可以被javadoc工具提取到API文档中 // 若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解 public @interface MyAnnotation { // public Direction value1(); //注解类型不允许使用Direction public String value() default "默认值"; //声明一个string类型的成员变量,名字为value public String value1() default "默认值"; }
元注解@Target
@Target用于指定被修饰的注解能用于哪些元素的修饰,取值如下:
从java8开始对元注解@Taget的参数类型ElementType枚举值增加了两个:
其中ElementType.Type_PARAMETER 表示该注解能写在类型变量的声明语句中,如:泛型。
其中ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
package com.lagou.task10; import java.lang.annotation.*; // @Retention(RetentionPolicy.SOURCE) // 表示下面注解在源代码中有效 // @Retention(RetentionPolicy.CLASS) // 表示下面的注解在字节码文件中有效,默认方式 @Retention(RetentionPolicy.RUNTIME) // 表示下面的注解在运行时有效 @Documented // 表示下面的注解信息可以被javadoc工具提取到API文档中 // 表示下面的注解可以用于类型、构造方法、成员变量、成员方法、方法内的形参的修饰 @Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER}) // 若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解 public @interface MyAnnotation { // public Direction value1(); //注解类型不允许使用Direction public String value() default "默认值"; //声明一个string类型的成员变量,名字为value public String value1() default "默认值"; }
所谓的注解就是标签,哪里需要标签往哪里贴就可以了。
Tatget的功能很清晰,标注什么地方能用注解,但是没有标注的地方用了就会报错。
元注解@Inherited
@Inherited并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注释时,如果子类没有被任何注解应用时,则子类就继承超类的注解。
就是说@Inherited修饰的注解在父类中使用,假设子类没有使用任何注解将继承父类的注解(继承@Inherited修饰的注解)
package com.lagou.task10; import java.lang.annotation.*; // @Retention(RetentionPolicy.SOURCE) // 表示下面注解在源代码中有效 // @Retention(RetentionPolicy.CLASS) // 表示下面的注解在字节码文件中有效,默认方式 @Retention(RetentionPolicy.RUNTIME) // 表示下面的注解在运行时有效 @Documented // 表示下面的注解信息可以被javadoc工具提取到API文档中 // 表示下面的注解可以用于类型、构造方法、成员变量、成员方法、方法内的形参的修饰 @Target({ElementType.TYPE,ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER}) @Inherited // 表示下面的注解所修饰的类中的注解使用可以被子类继承 // 若一个注解中没有任何的成员,则这样的注解叫做标记注解/标识注解 public @interface MyAnnotation { // public Direction value1(); //注解类型不允许使用Direction public String value() default "默认值"; //声明一个string类型的成员变量,名字为value public String value1() default "默认值"; }
元注解@Repeatble
@Repeatble表示自然可重复的含义,从java8开始增加的新特性。
假设要重复使用同一个注解,在java8以前是这样做的
利用数组的形式,把相同的注解放在一维数组中
package com.lagou.task10; /** * 自定义注解用于描述多种角色 */ public @interface ManTypes { ManType[] value(); }
package com.lagou.task10; @ManTypes({@ManType(value = "职工"),@ManType(value = "超人")}) public class Man { }
使用@Repeatble重写
使用@Repeatbla可以直接重复使用@ManType注解,不需要放在一维数组中,@Repeatble注解的value值需要填入class,这个注解本来是不能实现多次描述的它是依赖于@ManTypes这个注解,拿过来.class就可以了。
package com.lagou.task10; import java.lang.annotation.Repeatable; /** * 自定义注解用于描述任务的角色 */ @Repeatable(value = ManTypes.class) public @interface ManType { public String value() default ""; }
package com.lagou.task10; @ManType(value = "职工") @ManType(value = "超人") public class Man { }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/29761.html