注解

    注解,就是在类的某一个部分打上一个标记,那么注释类型的注释要保留多久呢?如果注释类型声明中不存在 Retention 注释,则保留策略默认为 RetentionPolicy.CLASS只有元注释类型直接用于注释时,Target 元注释才有效。如果元注释类型用作另一种注释类型的成员,则无效。注解保留时间:

    RetentionPolicy.CLASS:编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。

    RetentionPolicy.RUNTIME编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。

    RetentionPolicy.SOURCE:编译器要丢弃的注释。

 

下面定义一个注解,举一个例:

   @Retention(value=RUNTIME)

   public @interface Test{

        String value(); 

   }

 

  上面介绍了注解保存多久,如何定义,那注解可以使用在哪些地方呢?注解放在哪个地方用@Target元注解定义。

   @Target({ElementType.FIELD, ElementType.METHOD, ElementType.FIELD})
    public @interface Bogus {
        ...
    }

这样定义一个注解到底放在哪个地方,如果想让注解放在多个地方,在()加一个{}在大括号里面一一写出可放的位置,用逗号隔开。

    可放的位置:

     ElementType.ANNOTATION_TYPE:注释类型声明

     ElementType.CONSTRUCTOR :构造方法声明

     ElementType.FIELD :字段声明(包括枚举常量)

     ElementType.LOCAL_VARIABLE :局部变量声明

     ElementType.METHOD :方法声明

     ElementType.PACKAGE :包声明

     ElementType.PARAMETER: 参数声明

     ElementType.TYPE :类、接口(包括注释类型)或枚举声明

 

注解放在这些地方什么时候起作用呢?其实注解并没有什么作用,它只是起到一个标记的作用。只有注解处理类来处理它,这里就需要使用一些反射技术了,在一个类中,我们得到了其它的类的对象,我们就可以能过反射来得到它身上是否有这个标记。然后再针对这个标记的值进行处理。

    注解的属性:

        注解的属性的定义,跟在接口里面定义方法基本上相同,唯一不同的是注解里面的属性可以定义缺省值。一个属性定义后,如果我们想给它一个缺省值,就可以直接在后面写上缺省值,这样,在用这个注解的时候就可以不用给这个属性赋值,它就会使用缺省值。有一个特殊的属性,叫value这个可以定义后,使用的时候可以直接写值,直接写值,就相于是赋值给这个属性的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章