Java annotation注解类

367 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

Java注解实际上一般的修饰符使用方式没有什么区别,以我们自定义的 @OperLog注解为例:

  //删除用户
    @GetMapping("/deluser/{id}")
    @OperLog(operModul = "用户管理",operType = "删除",operDesc = "删除用户")
    public String deleteUser(@PathVariable("id")int id){
        userService.delUser(id);
        return "redirect:/users";
    }

通过在一个方法上使用@OperLog注解后,当运行到该方法时,就会识别到这个注解.如我们运行到这个deleteUser方法时,通过注解,我们知道现在的操作模块是“用户管理”,操作类型为“删除”,操作说明为“删除用户”。

下面通过@OperLog这个我们自定义的注解,讲解注解的基本语法。

基本语法

一、声明注解与元注解

package com.tjm.config;
import java.lang.annotation.*;

/*
    自定义操作日志注解
    @Author tjm
 */

// 注解放置的目标位置,METHOD是可注解在方法级别上
@Target(ElementType.METHOD)
// 注解在哪个阶段执行
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OperLog {
    String operModul() default ""; //操作模块
    String operType() default ""; //操作类型
    String operDesc() default ""; //操作说明
}

java元注解一共有4个,分别为:@Target、@Retention、@Document、@Inherited。

(1)@Target

指定注解使用的目标范围(类、方法、字段等)。

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
    /**
     * Returns an array of the kinds of elements an annotation type
     * can be applied to.
     * @return an array of the kinds of elements an annotation type
     * can be applied to
     */
    ElementType[] value();
}

返回的ElementType是注解类可以应用的元素类型的一个数组。

public enum ElementType {
     /**标明该注解可以用于类、接口(包括注解类型)或enum声明*/
    TYPE,
     /** 标明该注解可以用于字段(域)声明,包括enum实例 */
    FIELD,
      /** 标明该注解可以用于方法声明 */
    METHOD,
     /** 标明该注解可以用于参数声明 */
    PARAMETER,
     /** 标明注解可以用于构造函数声明 */
    CONSTRUCTOR,
    /** 标明注解可以用于局部变量声明 */
    LOCAL_VARIABLE,
    /** 标明注解可以用于注解声明(应用于另一个注解上)*/
    ANNOTATION_TYPE,
    /** 标明注解可以用于包声明 */
    PACKAGE,
    /**
     * 标明注解可以用于类型参数声明(1.8新加入)
     * @since 1.8
     */
    TYPE_PARAMETER,
     /**
     * 类型使用声明(1.8新加入)
     * @since 1.8
     */
    TYPE_USE
}

这种枚举类型的常量提供了注释在Java程序中可能出现的语法位置的简单分类。

@Target(ElementType.METHOD)就表示这个注解可以用于方法声明;

如果一个注解可用于多种元素类型,多个值用{}包含并用逗号分开,如下:

@Target(value={ FIELD,TYPE_PARAMETER, TYPE_USE,METHOD})