什么是注解,常用的注解,如何创建注解

7 注解

7.1 认识注解

注解(Annotation)是从JDK5开始引入的技术。

注解就是给程序加一些信息,用于修饰它后面紧挨着的其他代码元素,比如类、接口、字段、方法、方法中的参数、构造方法等;注解可以被编译器、程序运行时和其他工具使用,用于增强或修改程序行为等。

以“@注解名”在程序中存在,还可以添加一些参数值。

7.2 内置注解

Java内置了一些常用注解:@Override、@Deprecated、@SuppressWarnings,我们简要介绍。

7.2.1 @Override

@Override修饰一个方法,表示该方法不是当前类首先声明的,而是在某个父类或实现的接口中声明的,当前类“重写”了该方法。

这个注解不写也不会改变这些方法是“重写”的本质,那有什么用呢?它可以减少一些编程错误。如果方法有Override注解,但没有任何父类或实现的接口声明该方法,则编译器会报错,强制程序员修复该问题。

7.2.2 @Deprecated

@Deprecated可以修饰的范围很广,包括类、方法、字段、参数等,它表示对应的代码已经过时了,程序员不应该使用它,不过,它是一种警告,而不是强制性的,在IDE或Eclipse中,会给Deprecated元素加一条删除线以示警告。

在声明元素为@Deprecated时,应该用Java文档注释的方式同时说明替代方案,就像Date中的API文档那样,在调用@Deprecated方法时,应该先考虑其建议的替代方案。

从Java 9开始,@Deprecated多了两个属性:since和forRemoval。since是一个字符串,表示是从哪个版本开始过时的;forRemoval是一个boolean值,表示将来是否会删除。

7.2.3 @SuppressWarnings

@SuppressWarnings表示压制Java的编译警告,它有一个必填参数,表示压制哪种类型的警告,它也可以修饰大部分代码元素,在更大范围的修饰也会对内部元素起效,比如,在类上的注解会影响到方法,在方法上的注解会影响到代码行

Java提供的内置注解比较少,我们日常开发中使用的注解基本都是自定义的。不过,一般也不是我们定义的,而是由各种框架和库定义的,我们主要还是根据它们的文档直接使用。

7.3 自定义注解

7.3.1 元注解

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

@Target

用于描述注解的适用范围。

ElementType是一个枚举,主要可选值有:

  • TYPE:表示类、接口(包括注解),或者枚举声明;
  • FIELD:字段,包括枚举常量;
  • METHOD:方法;
  • PARAMETER:方法中的参数;
  • CONSTRUCTOR:构造方法;
  • LOCAL_VARIABLE:本地变量;
  • MODULE:模块(Java 9引入的)。

目标可以有多个,用{}表示。如果没有声明@Target,默认为适用于所有类型。

@Retention,

表示需要在什么级别保存该注释信息,用于描述注解的生命周期。

取值只能有一个,类型为RetentionPolicy,它是一个枚举,有三个取值:

  • SOURCE:只在源代码中保留,编译器将代码编译为字节码文件后就会丢掉;
  • CLASS:保留到字节码文件中,但Java虚拟机将class文件加载到内存时不一定会在内存中保留;
  • RUNTIME:一直保留到运行时。

如果没有声明@Retention,则默认为CLASS。

@Documented

表示注解信息包含到javadoc中

@Inherited

说明子类可以继承父类中的该注解。

7.3.2 自定义注解

定义注解的语法如下:

@Target(ElementType)
@Retention(RetentionPolicy)
...
public @interface 注解名称{
}
  • 其中的每一个方法实际上是声明了一个配置参数;
  • 方法的名称就是参数的名称;
  • 返回值类型就是参数的类型(返回值只能是基本类型Class,String,enum);
  • 可以通过default来声明参数的默认值;
  • 如果只有一个参数成员,一般参数名为value,这时value可以不显式的写出来;
  • 注解元素必须要有值,我们定义注解元素时,经常使用空字符串0作为默认值
public class Test {
    @MyAnnotation(name = "小明")
    public void f1() {
    }
}
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation {
    //注解的参数:参数类型 参数名字()
    String name();
    //String name()  default "";//不用显式赋值了
}
posted @ 2021-01-29 22:25  亚州Asu  阅读(1537)  评论(0编辑  收藏  举报