• 黑马程序员:Java基础总结----java注解


    黑马程序员:Java基础总结



    java注解

      ASP.Net+Android+IO开发 .Net培训 、期待与您交流!




    java注解

    lang包中的基本注解

    @SuppressWarnings
    通过System.runFinalizersOnExit(true);的编译警告引出@SuppressWarnings("deprecation") 

    @Deprecated
    直接在刚才的类中增加一个方法,并加上@Deprecated标注,在另外一个类中调用这个方法。

    @Override
    public boolean equals(Reflect other)方法与HashSet结合讲解

    总结:
    注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
    看java.lang包,可看到JDK中提供的最基本的annotation。 


    注解的应用结构

    //定义一个注解类
    @interface  annotation  {
    }
    //应用了“注解类”的类
    @annotation
    class  B{}
    //对“应用了注解类的类”进行反射操作的类
    class  c{
          {  annotation . class  .isAnnotation();}
          {B.  class .isAnnotationPresent( annotation  . class );}
          {  annotation . class  .getAnnotation( annotation .  class );}
    }

     boolean isAnnotation()
              如果此 Class 对象表示一个注释类型则返回 true。
     boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
              如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。
    <A extends Annotation>
    A
    getAnnotation(Class<A> annotationClass)
              如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
     Annotation[] getAnnotations()
              返回此元素上存在的所有注释。


    自定义注解

    元注解
    Documented 指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化。
    Inherited 指示注释类型被自动继承。
    Retention 指示注释类型的注释要保留多久。
    Target 指示注释类型所适用的程序元素的种类。

    注释类型 Retention    必需元素摘要

     RetentionPolicy value

    枚举 RetentionPolicy    枚举常量摘要

    CLASS
              编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。
    RUNTIME
              编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。
    SOURCE
              编译器要丢弃的注释。

    RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。

    @Retention (RetentionPolicy. SOURCE )
    @interface  annotation  {
    }
     思考: @Override、@SuppressWarnings和@Deprecated 对应的是  SOURCE,  SOURCE ,  RUNTIME

    注释类型 Target    必需元素摘要

     ElementType[] value

    枚举 ElementType    枚举常量摘要

    ANNOTATION_TYPE
              注释类型声明
    CONSTRUCTOR
              构造方法声明
    FIELD
              字段声明(包括枚举常量)
    LOCAL_VARIABLE
              局部变量声明
    METHOD
              方法声明
    PACKAGE
              包声明
    PARAMETER
              参数声明
    TYPE
              类、接口(包括注释类型)或枚举声明

    @Retention (RetentionPolicy. SOURCE )
    @Target (value = { ElementType. TYPE , ElementType. METHOD  }) //常用
    @interface  annotation  {
    }


    注解增加属性
    定义基本类型的属性和应用属性:
    在注解类中增加String color();
    @MyAnnotation(color="red")

    用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
    MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
    System.out.println(a.color());
    可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象

    为属性指定缺省值:
     String value()  default  "default"  ;

    value属性可简写:
    String value() default "zxx";
    如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,例如:@MyAnnotation("lhm")。

    数组类型的属性
    int [] arrayAttr() default {1,2,3};
    @MyAnnotation(arrayAttr={2,3,4})
    如果数组属性中只有一个元素,这时候属性值部分可以省略大括

    枚举类型的属性
    EnumTest.TrafficLamp lamp() ;
    @MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)

    注解类型的属性:
    MetaAnnotation annotationAttr() default @MetaAnnotation("xxxx");
    @MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”) )
    可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象,同样的道理,可以认为上面这个@MetaAnnotation是MetaAnnotation类的一个实例对象,调用代码如下:
         MetaAnnotation ma =  myAnnotation.annotationAttr();
         System.out.println(ma.value());


    import  java.lang.annotation.Retention;
    import  java.lang.annotation.RetentionPolicy;
    import  java.lang.annotation.Target;
    import  java.lang.annotation.ElementType;

    @annotation (lap = Lap. YELLOW , value =  "default" )
    public  class  Ts0 {
            public  static  void  main(String[] args)  throws  Exception {
                  if  (Ts0. class  .isAnnotationPresent( annotation .  class )) {
                        annotation  anno = ( annotation  ) Ts0. class .getAnnotation( annotation  . class );
                      System.  out .println(anno.order().value());
                }
          }
    }

    // 定义一个注解类
    @Retention (RetentionPolicy. SOURCE )
    @Target (value = { ElementType. TYPE , ElementType. METHOD  })
    @interface  annotation  {
          String value();

            int [] arr()  default  { 1, 2, 3 };

          Lap lap();

            orAnno  order()  default  @orAnno ( "123" );
    }

    enum  Lap {
            RED ,  GREEN  ,  YELLOW ;
    }

    // 另一个注视
    @interface  orAnno  {
          String value();
    }







      ASP.Net+Android+IO开发 .Net培训 、期待与您交流!

  • 相关阅读:
    微信坚硬的后脚跟
    [项目整理]Win32,MFC的可执行文件只能运行一次
    美司法部索要维基解密志愿者谷歌账户内容
    QML性能
    OSGi 的核心配置、动态化及问题
    OSGi 的由来和本质特性
    机器视觉与计算机视觉
    人工智能与深度学习
    活着就能改变世界
    选择与执行
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3184812.html
Copyright © 2020-2023  润新知