Java 注解总结

一.概述

在写JAVA代码的时候,我们经常会使用注解来简化代码,这些注解是需要我们自己定义的,当然JAVA本身也提供了一些标准注解。同时我们也建议大家在自己的代码中定义自己的注解,为了能够在代码中灵活使用注解,这里总结一下注解相关的东西。

二.三种标准注解和四种元注解

  • 三种标准注解
    @Override 标识当前方法必须在父类或者接口中存在,不然会出现编译错误
    @Deprecated 标识当前类,方法或者字段已经被废弃,不建议再使用
    @SuppressWarnings 用来关闭一些警告,比如可以使用@SuppressWarnings{“unchecked”}来关闭类型转换的警告

  • 四种元注解
    元注解是用来定义注解的。
    @Target
    标识该注解可以用在什么地方,可能的ElementType如下
    CONSTRUCTOR:构造函数声明
    FIELD:字段声明
    LOCAL_VARIABLE:局部变量声明
    METHOD:方法声明
    PARAMETER:参数声明
    ANNOTATION_TYPE:注解类型声明
    TYPE:类,接口或者枚举的声明
    PACKAGE:包声明
    @Retention
    标识需要在什么级别保存注解信息,可能的RetentionPolicy如下
    SOURCE:注解被编译器丢弃
    CLASS:注解在class文件中可用,但是被JVM虚拟机丢弃
    RUNTIME:注解在JVM虚拟机中保留,因此可以通过反射获取到注解信息
    @Documented
    此注解将会包含在javadoc中
    @Inherited
    允许子类继承父类中的注解

三.注解例子

  • 简单注解
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.taobao.Constraints;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Constraints {
    boolean primaryKey() default false;
    boolean allowNull() default true;
    boolean unique() default false;
}

这里看到有三个方法声明,其实这三个方法都是注解的元素,不是什么方法。因此我们使用注解的时候需要指定一下元素的值,比如

1
@Constraints(primaryKey = true, allowNull = false, unique = true)
  • 注解中的注解
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.taobao.Constraints;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)

public @interface DBColumn {
    int value() default 0;
    Constraints constraints() default @Constraints;
}

在DBColumn中我们使用了另外一个注解Constraints,即所谓的注解中使用注解。在使用DBColumn这个注解的时候,我们可以这样写

1
@DBColumn(value = 88, constraints=(@Constraints(primaryKey = true, allowNull = false, unique = true)))

在定义注解的时候,为元素提供defaultValue是一个好习惯。

四.注解的获取

在JAVA代码中我们一般使用反射来获取注解

1
2
3
4
5
6
// 获取类上面的注解
Class.getAnnotations()
// 获取字段上面的注解
Field.getAnnotations()
// 获取方法上面的注解
Method.getAnnotations()