Java注解

举报
周杰伦本人 发表于 2022/07/27 10:58:21 2022/07/27
【摘要】 Java注解 @Target @Retention @Inherited @Documented 总结 Java注解今天说一说我们经常用到的注解@Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LoginClient{}这是自定义的一个注解,注解接口有三...

Java注解

今天说一说我们经常用到的注解

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginClient
{
}

这是自定义的一个注解,注解接口有三个注解,这三个注解是什么含义呢?我们依次看一下

@Target

@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();
}

有以下范围值,TYPE:作用于类,接口,枚举类,FIELD:作用于域,METHOD:作用于方法,PARAMETER:作用于参数,CONSTRUCTOR:作用于构造器,LOCAL_VARIABLE:作用于局部变量,ANNOTATION_TYPE作用于注解,PACKAGE作用于包,TYPE_PARAMETER作用于普通变量的声明中,TYPE_USE:作用于任何类型的名称。

从以下源码中也可以看到@Target的取值

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

@Retention定义注解保留的级别,RUNTIME表示运行时有效,被编译器记录在类文件中,可以利用反射读取,另外两个CLASS表示被编译器记录在类文件中,但是运行时不会被保留,默认是这一个,SOURCE表示被编译器丢弃,在源文件中保留。

public enum RetentionPolicy {
    /**
     * Annotations are to be discarded by the compiler.
     */
    SOURCE,

    /**
     * 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,

    /**
     * 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
}

@Inherited

@Inherited表表示被标注的类能被继承,注解作用于子类。

@Documented

@Documented表示注解可以被javadoc类工具文档化

总结

java注解是我们在开发中经常遇到的一个技术点,这篇文章简单介绍了一下如何自定义一个注解和注解几个标准元注解,@Target表示这个注解修饰的对象范围,@Retention定义注解保留的级别,一般我们使用RUNTIME,这样可以利用反射获取信息,@Documented表示能够被工具文档化,也是用到的。对java注解的理解对以后的工作很有帮助

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。