合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
>[success] # java 元注解 1. 元注解是可以**注解到注解上的注解**,或者说**元注解是一种基本注解**,但是它能够应用到其它的注解上面。 2. 元注解主要有 **@Retention、@Documented、@Target、@Inherited、@Repeatable**。 >[danger] ##### @Retention 1. RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。 2. RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中,默认方式。 3. RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。 ~~~ import java.lang.annotation.*; //@Retention(RetentionPolicy.SOURCE) // 表示下面的注解在源代码中有效 //@Retention(RetentionPolicy.CLASS) // 表示下面的注解在字节码文件中有效,默认方式(不写) @Retention(RetentionPolicy.RUNTIME) // 表示下面的注解在运行时有效 public @interface MyAnnotation { } ~~~ >[danger] ##### @Documented 1. 使用javadoc工具可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档,而该工具抽取时默认不包括注解内容。 2. @Documented用于指定被该注解将被javadoc工具提取成文档。 3. 定义为@Documented的注解必须设置Retention值为RUNTIME。 ~~~ @Documented // 表示下面的注解信息可以被javadoc工具提取到API文档中,很少使用 public @interface MyAnnotation { } ~~~ >[danger] ##### @Target | 类型 |作用 | | --- | --- | | ElementType.ANNOTATION_TYPE| 可以给一个注解进行注解| | ElementType.CONSTRUCTOR | 可以给构造方法进行注解| | ElementType.FIELD | 可以给属性进行注解| | ElementType.LOCAL_VARIABLE | 可以给局部变量进行注解| | ElementType.METHOD | 可以给方法进行注解| | ElementType.PACKAGE| 可以给一个包进行注解| | ElementType.PARAMETER | 可以给一个方法内的参数进行注解| | ElementType.TYPE | 可以给类型进行注解,比如类、接口、枚举| ~~~ // 表示下面的注解可以用于类型、构造方法、成员变量、成员方法、参数 的修饰 @Target({ ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER }) public @interface MyAnnotation { } ~~~ >[danger] ##### @Inherited 1. **@Inherited**并不是说注解本身可以继承,而是说如果一个超类被该注解标记过的注解进行注解时,如果子类没有被任何注解应用时,则子类就继承超类的注解 >[danger] ##### @Repeatable 1. 可以重复使用同一个注解 * 正常重复使用一个注解会报错 ![](https://img.kancloud.cn/f6/84/f6848cc959cfc454e3d283f09e9962ce_643x191.png) * 解决一可以声明一个数组类型注解(java8 之前解决方案) ~~~ public @interface MyAnnotation { public String value(); } ~~~ ~~~ public @interface MyAnnotations { public MyAnnotation[] value(); } ~~~ ~~~ @MyAnnotations({ @MyAnnotation(value = "1"), @MyAnnotation(value = "2") }) public class TestAnnotation { int a = 1; } ~~~ * java 8之后解决 ~~~ public @interface MyAnnotations { public MyAnnotation[] value(); } ~~~ ~~~ import java.lang.annotation.*; @Repeatable(value = MyAnnotations.class) public @interface MyAnnotation { public String value(); } ~~~ ~~~ @MyAnnotation(value = "1") @MyAnnotation(value = "2") public class TestAnnotation { int a = 1; } ~~~ >[danger] ##### 其他 | 名称 | 作用 | | --- | --- | |@author |标明开发该类模块的作者,多个作者之间使用,分割| |@version| 标明该类模块的版本| |@see |参考转向,也就是相关主题| |@since |从哪个版本开始增加的| |@param |对方法中某参数的说明,如果没有参数就不能写| |@return| 对方法返回值的说明,如果方法的返回值类型是void就不能写| |@exception |对方法可能抛出的异常进行说明| |@Override |限定重写父类方法, 该注解只能用于方法| |@Deprecated |用于表示所修饰的元素(类, 方法等)已过时| |@SuppressWarnings| 抑制编译器警告|