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;  
    } 
    
  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/flypig666/p/13975285.html
Copyright © 2011-2022 走看看