注解

作者: 风若流塲 | 来源:发表于2020-01-09 20:39 被阅读0次

在java中合理使用注解是代码优雅的重要方式,使用注解在代码的可读性上会有所降低(对于初中级开发会导致一些阅读障碍),但是在代码的整洁和精简来说是非常有优势的。
注解只是filter的一种实现方式,创建注解看起来和接口类似:@interface,注解就是接口,只是是一种比较特殊的接口。
下面我们来看一个简单的注解示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Auth {
    String[] authority();
}

这里有两个重要的注解@Target,这个是使用注解的目标对象ElementType说明当前注解可以在哪些场景下使用,ElementType的源码如下:

public enum ElementType {
    /** Class, interface (including annotation type), or enum declaration */
    TYPE,    /* 类、接口(包括注释类型)或枚举声明  */

    /** Field declaration (includes enum constants) */
    FIELD,    /* 字段声明(包括枚举常量)  */

    /** Method declaration */
    METHOD,   /* 方法声明  */

    /** Formal parameter declaration */
    PARAMETER,     /* 参数声明  */

    /** Constructor declaration */
    CONSTRUCTOR,  /* 构造方法声明  */

    /** Local variable declaration */
    LOCAL_VARIABLE,   /* 局部变量声明  */

    /** Annotation type declaration */
    ANNOTATION_TYPE,   /* 注释类型声明  */

    /** Package declaration */
    PACKAGE,    /* 包声明  */

    /**
     * Type parameter declaration
     *
     * @since 1.8
     */
    TYPE_PARAMETER,   /* 类、接口(包括注释类型)或枚举的参数声明  */

    /**
     * Use of a type
     *
     * @since 1.8
     */
    TYPE_USE  /* 类、接口(包括注释类型)或枚举的使用声明  */
}

另外一个主要注解就是@Retention 声明作用域,指定当前定于的注解在什么时候生效。定于枚举是RetentionPolicy,源码如下:

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,  /* Annotation信息仅存在于编译器处理期间,编译器处理完之后就没有该Annotation信息了  */

    /**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     */
    CLASS,  /* 编译器将Annotation存储于类对应的.class文件中。默认行为  */

    /**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * @see java.lang.reflect.AnnotatedElement
     */
    RUNTIME  /* 编译器将Annotation存储于class文件中,并且可由JVM读入 */
}

如果一个注解声明作用域是SOURCE,则意味着只在代码的编译处理期生效,过后则不再起作用的。典型的如@override就是在编译时校验是否有重载,校验完后不在具有其他作用。CLASS 则意味着会执行在class文件中,只是不由JVM读入,CLASS是注解的默认行为,如果不定义@Retention则默认会是CLASSRUNTIME是表示会存储于class文件,并且由JVM读入。

每个注解都会和一个RetentionPolicy关联,每个注解都会和一个以上的ElementType关联。
一般比较常用的注解如:

@Deprecated 所标注内容,不再被建议使用。
@Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented 所标注内容,可以出现在javadoc中。
@Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
@Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
@Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
@SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。

在spring中也有很多实用注解:

@Controller
@Service
@Component
@RequestMapping
@RequestParam
@RequestBody
@Param
......

特别是在springboot中表现就更加明显了,很多原本需要复杂配置的内容都通过注解可以很简单就实现。
建议更深入了解注解。

相关文章

  • 注解学习笔记

    什么是注解注解分类注解作用分类 元注解 Java内置注解 自定义注解自定义注解实现及使用编译时注解注解处理器注解处...

  • 注解与反射

    注解 声明一个注解类型 元注解 在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之...

  • 1.8 Java 注解annotation

    1.1 注解声明 Java注解Annotation,有声明注解和元注解 元注解:Java提供的元注解,所谓元注解就...

  • 注解的使用

    元注解 注解 注解本质就是接口: 元注解:修饰注解的注解 自定义注解 Text.java FruitName.ja...

  • 注解

    Java注解 注解 元注解 自定义注解 元注解:负责注解其他注解 共有4个标准的meta-annotation类型...

  • Spring高级应用之组合注解和元注解

    1.核心概念: 元注解:可以注解在其他注解上的注解;被注解的注解成为组合注解; 2.组合注解的定义步骤 定义组合注...

  • 2016.10.13-关于注解的自定义和注解的解析

    注解可以分为:1、标识性注解(没有成员变量) 2、注解 3、元注解(注解的注解) 1、注解的自定义 自定义注解的格...

  • 自定义注解

    注解分类 1、代码注解2、编译时注解3、运行时注解 注解范例 使用注解的类 注解解析类 注解实战 需求1、有一张用...

  • 【JAVA】注解

    元注解 用来定义、声明注解的注解。 @Inherited注解 使用此注解声明出来的自定义注解,在使用此自定义注解时...

  • Spring Boot常用注解

    注解速览 配置加载相关 Bean 声明注解 Bean 注入注解 SpringMVC 注解 MyBatis 注解 配...

网友评论

      本文标题:注解

      本文链接:https://www.haomeiwen.com/subject/oxluactx.html