Day20——注解

文章目录

  • 注解
    • 1. 概述
    • 2. 内置注解
    • 3. 元注解
    • 4. 自定义注解

注解

1. 概述

  • 注解(Annotation):是从JDK 5.0开始引入的新技术,也是和 class、 interface一样,是一种类型;借用 https://blog.csdn.net/qq1404510094/article/details/80577555 这个博主的理解就很恰到好处,他是这样说的:想象代码具有生命,注解就是对于代码中某些鲜活个体贴上去的一张标签,简化来说,注解就是标签;

  • Annotation的作用:

    • 不是程序本身,可以对程序做出解释(这一点和注释(comment)没有什么区别);
    • 可以被其他程序(比如:编译器等)读取
  • Annotation的格式:

    • 注解是以“@注释名”在代码中存在的,还可以添加一些参数值;

      @SuppressWarnings(value = "unchecked").

  • Annotation 的使用:

    • 可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元素数据的访问

2. 内置注解

所谓的内置注解其实就是 java 里边已经存在的一些注解

  • @Override:定义在java.lang.Override中,此注解只适用于修饰方法,表示一个方法声明打算重写超类中的另一个方法声明;

    public class Demo {
        @Override
        public String toString() {
            return "Demo{}";
        }
    }
    
  • @Deprecated:定义在java.lang.Deprecated中,此注解可以用于修饰方法、属性、类,表示不鼓励程序员使用这样的元素(标记过时的元素),通常是因为它很危险或者存在更好的选择;

    public class Demo {
        public static void main(String[] args) {
        //在idea中书写此代码,将会在调用Method方法时,被画上一条横线,代表该方法付过时,或者危险
            new Demo().Method();  
        }
    
        @Deprecated
        public void Method() {
           
        }
    }
    
  • @SuppressWarnings:定义在java.long.SuppressWarnings中,用来抑制编译时的警告信息;

    • 与之前的注解不同之处在于,需要添加参数才能正确时使用,这些参数都是已经定好了的;
    • @SuppressWarnings(“all”) //镇压警告
    • @SuppressWarnings(“unchecked”)
    • @SuppressWarnings("value={“unchecked”, "deprecation “}”)

3. 元注解

  • 作用:负责注解其他注解,Java中定义了4个标准的meta-annotation类型作说明;

  • 这些类型和他们所支持的类在java.long.annotation包中可以找到。

    • @Target:用于描述注解的使用范围(即注解可以被使用在什么地方);

      @Target(value = {ElementType.METHOD,ElementType.TYPE})
      其中,value有以下值可用:
      TYPE  //Class, interface (including annotation type), or enum declaration
      FIELD //Field declaration (includes enum constants)
      METHOD //  Method declaration
      PARAMETER  //Formal parameter declaration
      CONSTRUCTOR // Constructor declaration
      LOCAL_VARIABLE   //Local variable declaration          
      ANNOTATION_TYPE    //Annotation type declaration
      PACKAGE   // Package declaration
      
      @Target(value={ElementType.METHOD, ElementType.FIELD})
      @interface MyAnnotation {
          
      }
      
    • @Retention:表示需要在什么级别保存该注解信息,用于描述注解的声明周期(也就是存活时间);

      //注解可以保留到程序运行的时候,它会被加载到 JVM 中,所以在程序运行时可以获取到它们;  默认
      @Retention(value = RetentionPolicy.RUNTIME)  
      //注解只被保留到编译进行的时候,它并不会被加载到 JVM 中;
      @Retention(value = RetentionPolicy.CLASS)   
      //注解只在源码阶段保留,在编译器进行编译时它将会被丢弃忽视;
      @Retention(value = RetentionPolicy.SOURCE)  
      
      @Retention(RetentionPolicy.RUNTIME)
      @interface MyAnnotation {
          
      }
      
    • @Documented:说明该注解将被包含在javadoc中;

      @Documented
      
    • @lnherited:说明子类可以继承父类的该注解,但是它并不是说注解本身可以被继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解;

      @MyAnnotation
      public class Father{
      
      }
                 
      public class Son extends Father{
      
      }           
      //自定义注解:(稍后会讲)
      @Retention((RetentionPolicy.RUNTIME)
      @Target(value = {ElementType.METHOD,ElementType.TYPE}) 
      @Inherited
      @interface MyAnnotation {
                     
      }           
                 
      /*
      因为自定义注解 MyAnnotation 被 @Inherited 修饰过,之后父类又被 MyAnnotation 注解, 子类继承父类且没有应用任何注解,那么子类也就拥有了 MyAnnotation 这个自定义的注解;
      */
      

4. 自定义注解

  • 使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口

  • 分析:

    • @interface用来声明一个注解,

      格式:public @interface 注释名{定义内容};

    • 其中的每一个方法实际上是声明了一个配置参数;

    • 方法的名称就是参数的名称;

    • 返回值类型就是参数的类型(返回值只能是基本类型,Class,String,enum);

    • 可以通过default来声明参数的默认值;

    • 如果只有一个参数成员,一般参数名为value;

    • 注解元素必须要有值,我们定义注解元素时,经常使用空字符串,0作为默认值;

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

/*
自定义注解
 */
public class Demo02UsrDefined {
    //注解可以显示赋值,如果没有默认值,一定要给注解赋值
    //赋值没有顺序
    @AnnotationDemo01(name = "权威",schools = {"1","2"})
    public void test(){
    }
}

//加上元注解
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationDemo01{
    //注解的参数:参数类型 + 参数名();
    String name();
    // String name() default "";   default是默认的意思
    int age()  default 0;
    int id() default  -1; //默认值为-1代表不存在
    String[] schools();
}

你可能感兴趣的:(Day20——注解)