1. 注解是一种标记,我们可以对拥有这种标记的元素进行处理

  2. Annotation接口

    java注解_注解

    所有注解类型都要继承的一个公共接口。手动继承这个接口并不会定义一个注解类型。这个接口本身并不是用来定义注解类型的。

    当我们使用@interface自定义注解时,隐含的继承了这个接口。

  3. java类型

    java有四种类型:类(class)、接口(interface)、注解(@interface)、枚举(enum)

4.  元注解

    注解的注解称为元注解。元注解有四种。

java注解_java_02

Target指定注解用在什么地方

Retention指定注解被保留多久

Inherited指定注解是否可以被继承

Documented指定注解是否被包含到javadoc中


Target有一个ElementType类型的数组value

java注解_注解_03

    ElementType中定义的常量

    java注解_java_04


    TYPE表示注解只能加在类、接口(包括注解)、枚举上

    METHOD表示注解只能加在方法上

    。。。

    

    Retention有一个RetentionPolicy类型的元素value。

    下面是RetentionPolicy中定义的枚举常量

java注解_注解_05

默认的RetentionPolicy是CLASS。


5. 自定义注解

    java注解_java_06

    

    java注解_java_07


    java注解_注解_08

    输出结果为null。因为,此时Hello注解RetentionPolicy为CLASS,表示编译时有效,运行时无效。也就是相当于在运行时没有Hello注解。如果我们将其改为RUNTIME,则输出结果如下:

    java注解_注解_09

    我们可以利用java反编译工具(Java Decompiler)查看一下Animal.class文件

    java注解_注解_10

    

    假设,我们已经将RetentionPolicy改为RUNTIME

    那么,下面的代码将输出结果

    java注解_注解_11

    

    java注解_注解_12


    之所以能输出结果是因为Hello注解被Inherited所修饰,表示注解可被继承。


6.  注解的作用

    注解给被注解的元素添加了额外的辅助信息,提供了一种统一处理的方式。如果没有外部解析工具对其加以解析和处理的话,它是不会对java源代码及class等产生任何影响,也不会影响程序的执行。   

7.  注解是给反射用的