• Java开发笔记(八十二)注解的基本单元——元注解


    Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义。前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的:

    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.SOURCE)
    public @interface Override {}
    

    又如注解@FunctionalInterface,它的源码定义与之类似:

    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface FunctionalInterface {}
    

    乍看过去,注解的定义竟与接口有几分相像,接口的类型名称是“interface”,而注解的类型名称是“@interface”,仅仅多了一个@符号。此外,内置注解的定义代码上方多出了好几个其它注解,包括@Target、@Retention、@Documented等等,这三个注解连同@Inherited组成了Java的“元注解”。四个元注解的作用是给新定义的注解添加修饰,标明新注解什么能干什么不能干,好比给一个战士配备各式各样的武器,使得他更适合在某种环境之中作战。接下来就对四种元注解分别进行详细介绍:

    1、@Documented
    该注解表示它修饰的注解将被收录到Java的开发文档中,这意味着程序员编码时的快捷提示会出现已收入的注解。
    所谓的快捷提示,指的是每当程序员输入少数几个字符并按下“Alt+/”时,eclipse就自动弹出以这几个字符开头的词汇列表,以便程序员迅速选择想要的词汇,从而加快编码速度。比如,程序员在某个空行输入字母M,然后按下组合键“Alt+/”,eclipse会弹出以M打头的词汇列表,包括数学函数库Math、映射Map、方法Method等等,此时点击“Method”这行提示,eclipse便自动把M补齐成为Method。
    添加了@Documented的注解如@FunctionalInterface,就会出现在这种提示列表;而@Override没被@Documented所修饰,就不会在提示列表中出现。故而程序员在一个空行输入符号@,然后按下组合键“Alt+/”,弹出的词汇列表中能找到“@FunctionalInterface”,却不能找到“@Override”了。

    2、@Target
    该注解表示它修饰的注解将作用于哪一类的代码实体,例如ElementType.METHOD规定@Override对方法有效,而ElementType.TYPE规定@FunctionalInterface对类型有效。更多的ElementType取值说明见下:
    TYPE:类型,包括类、接口和枚举。
    FIELD:字段,即类的属性。
    METHOD:方法,但不包含构造方法。
    PARAMETER:方法的参数。
    CONSTRUCTOR:构造方法。
    LOCAL_VARIABLE:局部变量。
    ANNOTATION_TYPE:注解类型。
    PACKAGE:包。

    3、@Retention
    该注解表示它修饰的注解将被编译器保留至哪个阶段,例如“@Retention(RetentionPolicy.SOURCE)”规定编译器只在编码阶段保留@Override,而“@Retention(RetentionPolicy.RUNTIME)”规定编译器直到运行阶段仍然保留@FunctionalInterface。更多的RetentionPolicy取值说明见下:
    SOURCE:只在编码阶段保留。
    CLASS:保留在编译生成的class文件中,但不在运行时保留。这样从class文件反编译出来的源码仍可找到它所修饰的注解。
    RUNTIME:一直保留至运行阶段。这样修饰后的注解可通过反射技术读取获得,以便代码在运行时动态校验注解。

    4、@Inherited
    该注解表示它修饰的注解将允许被子类所继承。
    通常情况下,一个注解加在某个类上面的话,它只对当前类有效,而对当前类的子类无效。倘若程序员希望该注解同时作用于当前类及其所有子类,则需要给这个注解的定义代码添加@Inherited修饰,表示该注解的作用范围扩展到当前类派生出来的子类。



    更多Java技术文章参见《Java开发笔记(序)章节目录

  • 相关阅读:
    DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布
    C# 与 .NET Framework 对应关系
    C# 基于Directshow.Net lib库 USB摄像头使用DirectShow.NET获取摄像头视频流
    Actor模型的状态(State)+行为(Behavior)+邮箱(Mailbox)
    c# 无法加载DLL:找不到指定的模块(异常来自HRESULT:0X8007007E)
    管道式编程(Pipeline Style programming)
    Word文档转Markdown插件(Windows)
    纯Java实现定时任务(转)
    Spring MVC使用Schedule实现定时任务
    Spring Boot使用Schedule实现定时任务
  • 原文地址:https://www.cnblogs.com/pinlantu/p/10673520.html
Copyright © 2020-2023  润新知