Java注解

219 阅读2分钟

前言

要理解注解,先理解元数据的概念。

1.元数据概念

元数据是关于数据的数据。在编译上下文中,元数据是添加到程序元素如方法、字段、类和包上的额外信息。对数据进行说明描述的数据。

(个人理解,有点类似我们平常使用“// ”或“/*...*/”的注释)

2.元数据的作用

  • 用于创建文档(根据程序元素上的注释创建文档)
  • 跟踪代码中的依赖行(可声明方法是重载,依赖父类的方法)
  • 执行编译时检查(可声明是否编译器检测)
  • 代码分析。


一、注解的概念

注解(Annotation)在JDK 1.5后增加的一个特性。关于注解的作用,基本就是上述元数据的作用。


注意:

Annotation能用来为程序(类、方法、成员变量等)设置元数据。Annotation不影响程序代码的执行,无论增加、删除Annotation,代码都始终如一地执行。

(Annotation只是用于解释当前类、方法、变量的作用,并且有些注解会在编译结束、类加载中丢弃。)


四种基本元注解:

@Documented  注解是否将包含在JavaDoc中

@Retention 什么时候使用该注解

@Target 注解用于什么地方

@Inhented 是否允许子类继承该注解。


@Documented

一个简单的annotations标记注释,表示是否将注解信息添加到java文档中。


@Retention

定义该注解的生命周期

RetentionPolicy.SOURCE 在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码中,如@Override、@SuppressWarnings也是该类注解

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

RetentionPolicy.RUNTIME 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注释的信息。自定义注解通常使用这种方式。


@Target

表示该注解用于什么地方。如果不明确指出,该注释可以放在任何地方。


@Inherited

定义该注解和子类的关系。


自定义注解

创建自定义注解,与创建接口有几分相似,但注解需要以@开头。

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotataion{
    String name();
    String website() default "hello";
    int revision() default 1;
}

自定义注解中定义成员变量的规则:

其定义是以无形参的方法形式来声明的。即:
注解方法不带参数,比如name(),website();
注解方法返回值类型基本类型、String、Enums、Annotation以及前面这些类型的数组类型
注解方法可有默认值,比如default "hello",默认website=”hello”