CodeEggDailyInterview icon indicating copy to clipboard operation
CodeEggDailyInterview copied to clipboard

谈谈对 java 注解的理解

Open kukyxs opened this issue 6 years ago • 1 comments

kukyxs avatar Sep 11 '19 13:09 kukyxs

  1. 定义:提供一种为程序元素设置元数据的方法,不能直接干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。
  2. 功能:
    • 作为特定的标记,用于告诉编译器一些信息
    • 编译时动态处理,如动态生成代码
    • 运行时动态处理,作为额外信息的载体,如得到注解信息
  3. 分类:
    • 标准注解:Override、Deprecated、SuppressWarnings 标准 Annotation 是指 Java 自带的几个 Annotation,上面三个分别表示重写函数,不鼓励使用(有更好方式、使用有风险或已不在维护),忽略某项 Warning;
    • 元注解:@Retention、@Target、@Inherited、@Documented 用来定义 Annotation 的 Annotation
    • 自定义注解:自定义 Annotation 表示自己根据需要定义的 Annotation,定义时需要用到上面的元 Annotation 这里是一种分类而已,也可以根据作用域分为源码时、编译时、运行时 Annotation

元注解

  1. @Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方),说明了Annotation所修饰的对象范围,Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
  2. @Retention 定义了该Annotation被保留的时间长短,表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
  3. @Documented 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
  4. @Inherited 是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
自定义注解

使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

支持的格式:

  1. 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  2. String类型
  3. Class类型
  4. enum类型
  5. Annotation类型
  6. 以上所有类型的数组

kukyxs avatar Sep 12 '19 15:09 kukyxs