ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[Java-基础] 注解

2020-02-21 22:53:14  阅读:254  来源: 互联网

标签:Java 基础 public declaration 注解 Retention annotation 描述


引言

在进行Spring Boot 入门的时候,主程序需要@SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用。这个的作用是什么?去掉的话会报错。如果单写这个不引入头文件也会报错,这说明这个东西是有意义的,会被编译器识别。当点进去,发现它又包括了很多个注解。

本着负责任的态度,来探究一下注解是什么。

注解的概念

  • 注解:Annotation 是从JDK5.0开始引入的新技术
  • Annotation 的作用:
    • 并不是程序本身,他可以对程序做出某种解释。这一点跟注释有点像
    • 但是注解可以被其他程序(比如:编译器)所读取。注释不会被注解读取。
  • Annotation 的格式:
    • 通常是以@注释名在代码中存在的,还可以添加一些参数值:例如:@SuppressWarnings(value='unchecked')
  • Annotation 的使用:
    • 可以附加在package,class,method,field等上面,相当于给它们添加了额外的辅助信息,我们可以通过反射机制编程实现对这些元数据的访问。
    • ps:学长曾说反射机制一定要理解,这个应该很重要。

内置注解

@Ovrride

public class zhujie /*extends Object*/{
    @Override
    public String toString(){
        return "hello";
    }
}

这里重写的是Object里的toString方法,加上@Ovrride什么意思呢?

@Ovrride就是一个注解,表示这个方法是重写了父类方法。但是如果这么写:

public class zhujie /*extends Object*/{
    @Override
    public String tostring(){
        return "hello";
    }
}

就会报错。

@Override并没有实际的作用,不写也是可以的,但是写上有以下好处:

  • 可以当注释用,表示这个方法名是父类有的
  • 编译器也可以识别,如果没有就会报错。所以加上编译器就会帮你检查方法的正确性。

@Deprecated

这个注解表示不推荐使用,但还是可以用的。

一个横线代表不推荐。

@SuppressWarnings

这个感觉真的太有用了。在写代码的时候重视会出现警告,但是有些警告多了反而麻烦。

这个注解上文说过是带参数的。

具体用法可以看这篇博客:https://www.cnblogs.com/perfei456/p/8962167.html

自定义注解

@Override打开,可以看到注解的格式:

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

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

自己写的注解跟这格式差不多,可能比这复杂

元注解

元注解的作用就是负责注解其他注解。Java定义了4个标准的meta-annotation类型,用来提供对其它annotation类型作说明

比较常用的是上面出现的@Target,@Retention

  • @Target

    它的作用就是用来描述注解的使用范围,比如说是可以修饰类,还是可以修饰方法的

  public enum ElementType {
      /** Class, interface (including annotation type), or enum declaration */
      /** 用于描述类、接口(包括注解类型)或enum声明*/
      TYPE,
  
      /** Field declaration (includes enum constants) */
      /** 用于描述域 (包括enum常量)*/
      FIELD,
  
      /** Method declaration */
      /** 用于描述方法 */
      METHOD,
  
      /** Formal parameter declaration */
      /** 用于描述参数 */
      PARAMETER,
  
      /** Constructor declaration */
      /** 用于描述构造器 */
      CONSTRUCTOR,
  
      /** Local variable declaration */
      /** 用于描述局部变量 */
      LOCAL_VARIABLE,
  
      /** Annotation type declaration */
      /** 用于描述注解 */
      ANNOTATION_TYPE,
  
      /** Package declaration */
      /** 用于描述包 */
      PACKAGE,
  
      /**
       * Type parameter declaration
       * 用于描述参数类型
       * @since 1.8
       */
      TYPE_PARAMETER,
  
      /**
       * Use of a type
       *类型的使用
       * @since 1.8
       */
      TYPE_USE
  }

如果用于描述方法的结果放在类前面,那么就会报错

  • 如果要多个参数也是可以的

@Target(value = { ElementType.METHOD,ElementType.TYPE})

  • @Retention

    Retention注解有一个属性value,是RetentionPolicy类型的,Enum RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解应该如何去保持,也可理解为Rentention 搭配 RententionPolicy使用。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
    按生命周期来划分可分为3类:

    取值 作用
    SOURCE 只在源文件中有效
    CLASS 在class文件中有效
    RUNTIME 在运行时有效,为runtime可以被反射机制读取

    在注解里定义的每一个方法实际上是声明一个配置参数。

  public @interface SetAnnotation {
      /*参数类型 参数名()*/
     String f();
      /*如果不加default,那么前面必须传一个参数*/
     /*可以通过default来声明参数的默认值*/
      String f() default "";
      int age() default 0;
  }

注解元素必须要有值,在定义注解元素的时候,经常使用空字符串,0作为默认值,也经常使用负数表示不存在的含义。

结语

但是注解如果只是定义了参数并没有用,还需要通过反射或其他程序去解析这些注解才有用。

现在只是暂时学习了语法。

标签:Java,基础,public,declaration,注解,Retention,annotation,描述
来源: https://www.cnblogs.com/smallocean/p/12343551.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有