JAVA-注解(2)-自定义注解及反射注解

自定义注解开发java

  1.开发一个注解类数组

    开发一个注解类的过程,很是相似于开发一个接口,只不过须要经过@interface关键字来声明工具

  2.使用元注解修饰注解的声明spa

    所谓的原注解是用来修饰注解声明的注释,能够控制被修饰的注解的特性。code

    @Targetblog

      用来声明被修饰的注解能够用在什么位置。继承

      能够在@Target的属性中设置Element Type类型的数组来指定可使用的位置。接口

      若是不使用此原注解修饰,默认注解能够用在任意位置。内存

    @Retention开发

      用来声明被修饰的注释会被保留到什么阶段。

      能够在该注解的属性中经过RetentionPolicy类型的值来指定注释被保留到什么时候。

        (1)RetentionPolicy.SOURCE

            此注解将会被保留到源码阶段,java中,在编译过程当中被删除。

            这种类型的注解一般是给编译器看的。

        (2)Retention Policy.CLASS

            此注解将会被保留到源码阶段和编译阶段,.java和.class中,在类加载的过程当中被删除。

            这种类型的注解一般是给类加载器看的。

        (3)RetentionPolicy.RUNTIME

            此注解将会被保留在源码阶段、编译阶段和运行阶段,.java  .class和内存中的字节码中都会存在。

            这种类型的注解一般在运行阶段进行反射,控制程序运行过程。

         ***只有RUNTIME级别的注解才能够经过反射技术进行反射。

    @Documented

        用来声明被修饰注解是否要被文档提取工具提取到文档中。

        默认不提取

    @Inherited

        被修饰的注释是否具备继承性

        默认没有继承性

  3.为注解增长属性

    注解类中还能够有声明属性。

    为注解类声明属性的过程很是相似于接口定义方法。

    但要求,注解中的全部的属性必须是public的,能够显式声明,也能够不声明,不声明默认就是public的。

    注解中的属性只能是八种基本数据类型、String类型、Class类型、其余注解类型及以上类型的一维数组。

    注解中声明的属性 须要在使用注解时,为其赋值,赋值的方式就是在使用注解时,在注解后跟上一对小括号,在括号中经过  属性名=属性值   的方式指定属性的值

    也能够在声明注解时,在注解的属性后面经过default关键字,声明属性的默认值,这样一来,使用注解时不赋值,将会使用default默认值,固然也能够手动赋值,覆盖默认值。

    若是属性是一维数组类型,在传入的数组中,只有一个值,则包括数组的大括号也能够省略。

    若是注解的属性只有一个须要赋值,且该属性的名称叫作value,则在使用注解时,value==能够不写

反射注解

  1.反射注解的原理

    RetentionPolicy.RUNTIME级别的注解会保留到运行中,能够经过反射技术获取,从而能够根据是否有注解 或 注解属性值的不一样来控制程序按照不一样方式运行。

    如下反射相关的类型中都提供了反射注解的方法:

      类Class<T>、类Method、类FIeld、类Constructor<T>、类Package

    

  2.反射注解案例

 1 package cn.tedu.test;
 2 
 3 import java.lang.annotation.ElementType;
 4 import java.lang.annotation.Retention;
 5 import java.lang.annotation.RetentionPolicy;
 6 import java.lang.annotation.Target;
 7 
 8 @Target(ElementType.TYPE)
 9 @Retention(RetentionPolicy.RUNTIME)
10 @interface level{
11     String value();
12 }
13 
14 @level("刑警")
15 class Police{
16 }
17 
18 public class AnnoTest02 {
19     public static void main(String[] args) {
20         System.out.println("敬了个礼,您好,您超速了,罚款200元。。。");
21         if(Police.class.isAnnotationPresent(level.class)){
22             level anno = Police.class.getAnnotation(level.class);
23             if("协警".equals(anno.value())){
24                 System.out.println("哥们少罚点,50块得了~~");
25             }else if("交警".equals(anno.value())){
26                 System.out.println("哥们抽根烟,这是200块,收好我走人~~");
27             }else if("刑警".equals(anno.value())){
28                 System.out.println("赶忙交钱走人,别查出 别的事。。。");
29             }else{
30                 System.out.println("xxx");
31             }
32         }else{
33             System.out.println("打一顿,扭送警察局。。");
34         }
35     }
36 }
相关文章
相关标签/搜索