zoukankan      html  css  js  c++  java
  • 注解的使用

    注解是JDK1.5有的

    应用注解,进行开发和应用:

    注解相当于一个特殊的类哦!

       

    首先定义一个注解的类  @interface toov5

    然后应用这个注解 @A

    然后对这个类进行反射调用

    一个注解的生命周期有三个阶段:

    1、  RetentionPolicy.RUNTIME

    2 、 RetentionPolicy.SOURCE

    3、   RetentionPolicy.CLASS

    分别对应Java源文件   calss文件(通过类加载器调用进内存就没有了,比如 @Override等)   内存中的字节码  这三个阶段都可以将注解去掉。 设计时候可以进行声明

    总结: 注解用在哪个阶段、什么类型(方法、类、包、注解、构造方法等)上面。   

    元注解以及其枚举属性值不用记,直接看java.lang.annotation包下面的类

    做一个注解:

    @Retention(RetentionPolicy.RUNTIME)  //为注解服务的 元注解  保留到运行期间
    //@Target(ElementType.METHOD) //只能放在Method上不能放在类上
    @Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
    public @interface toov5 {
    
    
    }

    使用它:

    @toov5
    public class test1 {
        public static void main(String[] args) {
            //玩字節碼,看看有注解沒  注解是否在場
            boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
            if (annotationPresent){  //如果有这个注解
                toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
                System.out.println(annotation);
            }
        }
    }

     

    注解的属性相当于一个胸牌,比如实验中学学生。如果再想细致的区分,那么可以通过这个胸牌再加一个属性区分。

     @MyAnnotation(color = "red")

    可以有默认值:

    @Retention(RetentionPolicy.RUNTIME)  //为注解服务的 元注解  保留到运行期间
    //@Target(ElementType.METHOD) //只能放在Method上不能放在类上
    @Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
    public @interface toov5 {
      String color() default "red";   //抽象的并且是public的  指定一个属性默认值
      String value();
    }

    测试:

    @toov5(value = "test") // 创建这个注解的实例对象时候需要给属性赋值
    public class test1 {
        public static void main(String[] args) {
            //玩字節碼,看看有注解沒  注解是否在場
            boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
            if (annotationPresent){  //如果有这个注解
                toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
                System.out.println(annotation.color()+"-----"+annotation.value());  //打印这个注解属性 取值时候还是以方法调用的形式进行调用
            }
        }
    }

     

     属性复杂一些的比如 数组类型的:

    注解:

    @Retention(RetentionPolicy.RUNTIME)  //为注解服务的 元注解  保留到运行期间
    //@Target(ElementType.METHOD) //只能放在Method上不能放在类上
    @Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
    public @interface toov5 {
      String color() default "red";   //抽象的并且是public的  指定一个属性默认值
      String value();
      int[] arrayAttr() default {1,6};
    }

    使用:

    @toov5(value = "test", arrayAttr = {1,3,6}) // 创建这个注解的实例对象时候需要给属性赋值
    public class test1 {
        public static void main(String[] args) {
            //玩字節碼,看看有注解沒  注解是否在場
            boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
            if (annotationPresent){  //如果有这个注解
                toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
                System.out.println(annotation.color()+"-----"+annotation.value());  //打印这个注解属性 取值时候还是以方法调用的形式进行调用
                System.out.println(annotation.arrayAttr().length);
            }
        }
    }

    结果:

    属性的值可以使注解的!

     另外写一个注解:

    public @interface toov5Annotation {
        String value();
    }

    注解中引用这个注解:

    @Retention(RetentionPolicy.RUNTIME)  //为注解服务的 元注解  保留到运行期间
    //@Target(ElementType.METHOD) //只能放在Method上不能放在类上
    @Target( {ElementType.TYPE, ElementType.METHOD}) //数组里面 类 方法
    public @interface toov5 {
      String color() default "red";   //抽象的并且是public的  指定一个属性默认值
      String value();
      int[] arrayAttr() default {1,6};
      //返回注解
        toov5Annotation toov5Annotation() default @toov5Annotation("toov5");  //默認值
    }

    测试:

    @toov5(value = "test", arrayAttr = {1,3,6} , toov5Annotation = @toov5Annotation("ttttttest")) // 创建这个注解的实例对象时候需要给属性赋值
    public class test1 {
        public static void main(String[] args) {
            //玩字節碼,看看有注解沒  注解是否在場
            boolean annotationPresent = test1.class.isAnnotationPresent(toov5.class);
            if (annotationPresent){  //如果有这个注解
                toov5 annotation = test1.class.getAnnotation(toov5.class); //得到这个对象
                System.out.println(annotation.color()+"-----"+annotation.value());  //打印这个注解属性 取值时候还是以方法调用的形式进行调用
                System.out.println(annotation.arrayAttr().length);
                System.out.println(annotation.toov5Annotation().value());
            }
        }
    }

    结果:

     属性也可是是枚举类的!

     略

    也可以是class! 略

      

  • 相关阅读:
    c# 三种取整方法 向上取整 向下取整 四舍五入
    Lambda表达式对DataRow处理
    Dapper数据库字段和model属性映射
    union limit
    北邮五十题
    搜索____深搜 学易错点
    动态规划____有重叠子问题的搜索,都可以转为记忆化搜索
    64位 __int 与 long long写法
    做做 卡特兰数 与 卡米歇尔数
    vector 有点麻烦啊 能简单点么?
  • 原文地址:https://www.cnblogs.com/toov5/p/10836110.html
Copyright © 2011-2022 走看看