首页 > 技术文章 > 50 注解

flypigggg 2021-04-13 21:40 原文

注解

  1. java增加了对元数据(MetaData)的支持,也就是Annotation(注解)

Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。|

Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的“name=value”对中。

未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,一定程度上可以说:框架=注解+反射+设计模式

 

  1. ●示例一:生成文档相关的注解 @author标明开发该类模块的作者,多个作者之间使用,分割

@version标明该类模块的版本 @see参考转向,也就是相关主题

@since从哪个版本开始增加的 @param对方法中某参数的说明,如果没有参数就不能写 @return对方法返回值的说明,如果方法的返回值类型是void就不能写 @exception对方法可能抛出的异常进行说明,如果方法没有用throws显式抛出的异常就不能写其中 @param @return和@exception这三个标记都是只用于方法的。@param的格式要求:@param形参名形参类型形参说明 @return的格式要求:@return返回值类型返回值说明exception的格式要求:@exception异常类型异常说明param和@exception可以并列多个

●示例二:在编译时进行格式检查(JDK内置的三个基本注解)

@Override:限定重写父类方法,该注解只能用于方法 @Deprecated:用于表示所修饰的元素(类,方法等)己过时。通常是因为所修饰的结构危险或存在更好的选择 @SuppressWarnings:抑制编译器警告

●示例三:跟踪代码依赖性,实现替代配置文件功能

 

  1. 如何自定义注解:

  • 注解声明为:@interface

  • 内部定义成员:通常使用value表示

  • 可以指定成员的默认值,使用default定义

  • 如果自定义注解没有成员,表明是一个标识作用

如果注解有成员,在使用注解时,需要指明成员的值

自定义注解必须配上注解的信息处理流程(使用反射)才有意义

自定义注解通过都会指明两个元注解:Retention、Target

public @interface MyAnnotation {

   String value() default "Hello";
}

 

  1. jdk 提供的4种元注解

元注解:对现有的注解进行解释说明的注解

提供了4个标准的:

Retention:指定说修饰的 Annotation 的生命周期: SOURCE\CLASS(默认行 为)\RUNTIME(只有声明为RUNTIME声明生命周期的注解,才能通 过反射获取。)

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {

   String value() default "Hello";
}

 

Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

******出现的频率较低**

Documented:表示所修饰的注解在被javadoc解析时,保留下来。

Inherited:被它修饰的 Annotation 将具有继承性

 

  1. 通过反射获取注解信息 。

 

  1. jdk 8 中注解的新特性:可重复注解、类型注解

    6.1 可重复注解:① 在MyAnnotation 上声明@Repeatable,成员值为MyAnnotations.class

    ② MyAnnotation 的 Target 和 Retention 等元注解与 MyAnnotations相同

@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {
   String value() default "Hello";

}

@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {

   MyAnnotation[] value();
}

 

6.2 类型注解

ELementType.TYPE_PARANETER表示该注解能写在类型变量的声明语句中(如:泛型声明)。

ELementType.TYPE_USE表示该注解能写在使用类型的任何语句中。

推荐阅读