什么是注解

注解就相当于对源代码打的标签,给代码打上标签和删除标签对源代码没有任何影响。有的人要说了,你尽几把瞎扯,没有影响,打这些标签干毛线呢?其实不是这些标签自己起了什么作用,而且外部工具通过访问这些标签,然后根据不同的标签做出了相应的处理。这是注解的精髓,理解了这一点一切就变得不再那么神秘。
例如我们写代码用的IDE(例如 IntelliJ Idea),它检查发现某一个方法上面有@Deprecated这个注解,它就会在所有调用这个方法的地方将这个方法标记为删除。

访问和处理Annotation的工具统称为APT(Annotation Processing Tool)

注解需要配合反射来使用,用反射来读取注解的内容.进行其它的操作

注解的作用以及起源

在出现注解之前,xml被广泛的应用在描述元数据,不知道从什么时候开始,一些开发人员和架构师发现xml的维护越来越糟糕,他们希望使用一些和代码紧耦合的东西,而不是像xml那样和代码是松耦合的代码描述.
假如你想为应用设置很多的常量或参数,这种情况下,XML是一个很好的选择,因为它不会同特定的代码相连。如果你想把某个方法声明为服务,那么使用Annotation会更好一些,因为这种情况下需要注解和方法紧密耦合起来,开发人员也必须认识到这点。

元注解

用来给其他注解打标签的注解,即用来注解其他注解的注解。元注解共有6个。从上面的基本注解的源代码中就会看到使用了元注解来注解自己。

https://www.cnblogs.com/lyy-2016/p/6288535.html

注解的生命周期

@Retention– 定义该注解的生命周期。
RetentionPolicy.SOURCE – 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。

RetentionPolicy.CLASS – 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。

RetentionPolicy.RUNTIME– 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
https://blog.csdn.net/asdgbc/article/details/70196749

注解的作用域

表示该注解可以用于一个类中的那些属性及方法上,如果作用域类型有多个用英文逗号分隔

下面是注解的作用域的列表:

@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
https://blog.csdn.net/u012992462/article/details/80675932

自定义注解的使用

定义注解

@Target:描述当前注解能够作用的位置
ElementType.TYPE:可以作用在类上
ElementType.METHOD:可以作用在方法上
ElementType.FIELD:可以作用在成员变量上

@Retention: 描述注解被保留到的阶段
SOURCE:表示当前注解只在代码阶段有效
CLASS:表示该注解会被保留到字节码阶段
RUNTIME:表示该注解会被保留到运行阶段 JVM
自定义的注解:RetentionPolicy.RUNTIME;SOURCE < CLASS < RUNTIME

  1. /**
  2. * 本质: interface extends Annotation
  3. * 属性和使用: 返回值 基本数据类型、string、enum、class、anno类型及数组类型
  4. * 属性名是value的时候得特殊规定
  5. * 元注解:注解的注解
  6. */
  7. import java.lang.annotation.*;
  8. @Retention(RetentionPolicy.RUNTIME)
  9. @Target(ElementType.METHOD)
  10. @Inherited
  11. @Documented
  12. public @interface MyAnno {
  13. //注解中定义的方法叫做属性
  14. int showInt() default 1;
  15. String[] showStrArr();
  16. ColorEnum showEnum();
  17. MyAnno2 showAnno();
  18. }
  1. public enum ColorEnum {
  2. RED,BlACk;
  3. }
  1. public @interface MyAnno2 {
  2. String value();
  3. }

使用

  1. @MyAnno(showStrArr = {"hello","nx"},showEnum = ColorEnum.BlACk,showAnno=@MyAnno2("valueStr") )
  2. public void shownx02(){
  3. System.out.println("nx nx nx。。。");
  4. }