Java注解(Annotation)详解

时间:2020-12-09 20:16:26

Java注解(Annotation)详解

对于Java开发的同学来说,注解(Annotation)应该是一个非常熟悉的语法,在开发的过程中,我们经常会用到注解,通过注解也让我们的开发变得更加简化;这里我们就来深入浅出的说一下Java中的这个特别重要的特性:注解(Annotation)


注解的介绍(Annotation)

  • 注解是JDK 5.0版本引如的,源码作者Jaoshua Bloch

  • 注解的作用是修饰编程元素(编程元素:包、类、方法、构造方法、成员变量等程序组成部分),提供了一种安全的类似于注释的机制,将信息或元数据与编程元素进行关联。

  • 生成文档。这是最常见的,也是Java 最早提供的注解。常用的有@see @param @return 等 ;

  • 跟踪代码依赖性,实现替代配置文件功能。例如SpringBoot 中大量基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量;

  • 在代码编译时进行格式检查或代码运行时进行配置信息的设置。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。


注解的语法与组成

元注解

  • @Document:定义该注解是否生成到当前文件的JavaDoc中
  • @Retention:定义该注解的生命周期
  • @Target:注解修饰的编程元素
  • @Inherited:是否允许子类继承父类的注解

元注解的取值范围

@Retention

取值 含义
RetentionPolicy.SOURCE 只存在于.java文件中,例如:@Override
RetentionPolicy.CLASS 存在于.class文件中,编译阶段存在,类加载的时候丢弃,Java默认的就是这种取值
RetentionPolicy.RUNTIME 始终不会丢弃,运行期也会保留该注解,可以使用反射机制读取该注解的信息,例如:@Documented

@Target

取值 含义
ElementType.TYPE 类、接口、注解或者枚举
ElementType.FIELD field属性或者枚举常量
ElementType.METHOD 方法声明上
ElementType.PARAMETER 参数
ElementType.CONSTRUCTOR 构造方法
ElementType.LOCAL_VARIABLE 局部变量
ElementType.ANNOTATION_TYPE 注解上使用
ElementType.PACKAGE 描述包

注解的语法和定义形式

  • 注解以@interface关键字定义
  • 注解中可包含成员,成员以无参数的方法形式被声明,方法名是该成员的名称,返回类型是该成员的类型
  • 注解的成员赋值是通过@Annotation(name=value)来进行的
  • 注解需要标明注解的生命周期(@Retention)和修饰编程元素(@Target)以及是否在JavaDoc中生成(@Documented)和是否被子类继承注解(@Inherited) ,这些信息通过元注解来进行实现

自定义注解


package _20170419;

import java.lang.annotation.*;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {

String name() default "";

}

代码分析

  • @Target(ElementType.TYPE) 表示该注解可作用于类,接口,注解或者枚举中
  • @Retention(RetentionPolicy.RUNTIME)表示该注解在运行时保留,永不丢弃,可以通过反射来获取注解中的成员值
  • @Inherited 表示该注解会被子类继承
  • @Documented 表示该注解会生成到当前文件的JavaDoc中
  • @interface Table表示该注解名称为Table
  • String name() default “”; 表示该注解的成员名称为name,name的类型为String

获取注解的值


package _20170419;

import org.junit.Test;

@Table()
public class TableTest {

@Test

public void validTableAnnotation(){
System.out.println(“开始注解过程”);
TableTest tableTest = new TableTest();

  if (TableTest.class.isAnnotationPresent(Table.class)) {
Table table =
TableTest.class.getAnnotation(Table.class);
System.out.println("name:"+table.name());
}

}
}