zoukankan      html  css  js  c++  java
  • Java 元注解

    一、介绍

    元注解的作用就是负责注解其他注解,Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:

    • @Target
    • @Retention
    • @Documented
    • @Inherited

    这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。

    二、各元注解作用

    @Target

      @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

      作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

      取值(ElementType)有:

        1.CONSTRUCTOR:用于描述构造器
        2.FIELD:用于描述域即类成员变量
        3.LOCAL_VARIABLE:用于描述局部变量
        4.METHOD:用于描述方法
        5.PACKAGE:用于描述包
        6.PARAMETER:用于描述参数
        7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

    实例:

    @Target(ElementType.TYPE)  
    public @interface Table {  
        /** 
         * 数据表名称注解,默认值为类名称 
         * @return 
         */  
        public String tableName() default "className";  
    }  
      
    @Target(ElementType.FIELD)  
    public @interface NoDBColumn {  
      
    }  
    

    注解Table 可以用于注解类、接口(包括注解类型)或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。

    @Retention

      @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

      作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

      取值(RetentionPoicy)有:

        1.SOURCE:在源文件中有效(即源文件保留)
        2.CLASS:在class文件中有效(即class保留)
        3.RUNTIME:在运行时有效(即运行时保留)

      Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:

    @Target(ElementType.FIELD)  
    @Retention(RetentionPolicy.RUNTIME)  
    public @interface Column {  
        public String name() default "fieldName";  
        public String setFuncName() default "setField";  
        public String getFuncName() default "getField";   
        public boolean defaultDBValue() default false;  
    }  
    

    Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理。

    @Documented

      @Documented:描述在使用javadoc 工具为类生成帮助文档时是否要保留其注解信息。打开生成的doc文件夹,打开 index.html ,可以发现在类和方法上都保留了MyDocumentedt 注解信息。,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

    @Inherited

      @Inherited 元注解只能应用于对类的注解如果一个类具有继承注解,那么它的所有子类都自动具有同样的注解。(书中原话)

      @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

      注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

      当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层.

    实例代码:

    /**  
     * @author wangsheng 
     **/  
    @Inherited  
    public @interface Greeting {  
        public enum FontColor{ BULE,RED,GREEN};  
        String name();  
        FontColor fontColor() default FontColor.GREEN;  
    } 
    
  • 相关阅读:
    Cisco 路由器硬件信息(各种序列号)查询命令
    解析黑客利用交换机漏洞攻击的常用手段
    所有windows操作系统键盘操作
    [转载]UC黑话解释Cisco统一通信江湖黑话解释
    常用照片尺寸和纸张尺寸参考
    Word中如何選擇從向文字
    python基础数据类型元组(tuple)
    promiseAll 使用
    js JavaScript 封装异步函数并被调用
    promise 学习2
  • 原文地址:https://www.cnblogs.com/flypig666/p/13975285.html
Copyright © 2011-2022 走看看