注解的使用

注解是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! 略

  

 

posted @ 2019-05-09 00:19  toov5  阅读(488)  评论(0编辑  收藏  举报