关于注解

来源:互联网 发布:绝地求生罗技g502编程 编辑:程序博客网 时间:2024/05/17 08:15

注解

概述

注释:// /**/

注解:给程序(编译器,类加载器,JVM)看的

注解的作用:在一些使用的场景中代替实现轻量级的配置

(副作用:增加了了耦合度)

常见注解

@Override

  • 重写父类方法.给编译器看,在编译时雁阵该方法是否符合重写的规则.
Override    public String toString(){        return super.toString();    }

@SuppressWarnings

  • 抑制编译器
@SuppressWarnings("unused")    public void lol(){        int x=8;    }

@Deprecated

-表示方法已经过时

@Deprecated    public static void sleep(){    }

注解的开发流程

  • 定义注解->反射注解->使用注解
  • @注解名称[(属性名 1=值,属性名 2=值…….)]
  • 使用时可以附属性赋值,也可以没有属性赋值

自定义注解

public @interface test {}   
  • 底层帮我们自动实现了 java.lang.annotation.Annotatino
  • 定义注解的时候只能使用@interface来定义,不能手实现

注解的属性

1. 和接口中的方法定义类似:public配型 属性名称() [default…];可以default指定默认值.
2. 如果属性定义是没有指定默认值,那么对应注解使用的时候必须为该属性赋值.
3. 如果某些场景,使用注解是必须为其中某一属性赋值,赋值完成之后该注解才可以被使用,那么不要使用default指定默认值.
4. 特殊属性value,单独危改属性赋值是,”value=”可以省略;除了为value赋值以外,同时还需要为其他属性赋值,这是”value=”不可以省略.
5. 属性的类型通常是巴中基本数据类型.Class类/枚举/String.
6. 为数组类型的属性赋值是,如果值只有一个,那么赋值是”{}”可以省略.

源生注解

  • 在定义注解是,如果没有使用Target指定,默认都可以使用.如果使用了Target指定使用的位置,那么该注解只能在他所指定的位置使用.

@Retention

@Retention(RetentionPolicy.SOURCE):表示注解的保留域.
.java -> .class -> 加载至内存 -> 运行

SOURCE 给编译器看的,编译器看完后不再保留.生成的.class字节码文件中不再保留该类型的注解.

CLASS 给类加载器看的,在类加载是根据相关的注解做一些引导操作.编译时(.class字节码文件中保留),类加载时使用后丢弃.

RUNTIME 给JVM看的.编译器编译后保留,类加载器加载后保留,JVM执行时保留.

@Documented

- 如果在注解上定义@Documented则会在生成的javadoc中显示所使用的注解

反射注解

前提条件:注解要想被反射的到,注解的保留域必须指定为RUNTIME,否则反射不到。
jdk中提供的注解反射接口:AnnotatedElement,提供了以下方法:

 xxx.getClass.getAnnotation(Class<T> annotationClass);

返回直接存在于此元素(类或接口、方法、…)上的所有注解。

 boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) 

如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。