在Java中注释的英文为Comment。而注解的英文是Annotation。
虽然注解和注释一样,也是在源代码中添加额外的补充信息。但注解都是以@开头的。
注解可以在类、字段变量、方法、接口等位置进行标记。主要为后续一些诸如:代码生成、数据校验、资源整合等工作进行铺垫。
基本注解
例如一段代码:
@Override
public String toString() {
return "Hello World";
}
这段代码是表示重写了父类的toString()方法。如果不使用@Override代码也可以正常执行。但使用了@Override代表告诉编译器这是一个重写方法。如果我们把方法名打错,就提前报错。这可以在前期排除一些简单的问题。
如果代码不加@Override,那在我们把方法名打错的情况,这个方法就变成一个普通的方法,而不是重写方法。
注解本身是一种数据类型,是一种接口类型。是一种语法糖,其中复杂的过程由编译器来帮我们完成。
直到Java11共有11个内置注解。其中有 5 个是基本注解,它们来自于 java.lang 包。有 6 个是元注解,它们来自于 java.lang.annotation 包,自定义注解会用到元注解。
- @Override表示重写方法
- @Deprecated表示弃用方法
- @SuppressWarnings用于抑制警告
- @SafeVarargs用于抑制警告
- @FunctionalInterface用于指定接口,保证该接口只能包含一个抽象方法。
在Java的文档注释中同样也有@deprecated,仅仅差了一个开头的大小写。虽然两者的目的差不多,都是为了表示该方法已经过时。但两者的作用却不一样文档注释作用与文档,编译器不会给出警告,注释也不直接作用于程序。而注解是直接用于修饰程序中的程序单元,如方法、类和接口等。并且注解是Java5之后才开始支持。而文档注释仅仅在程序外整理。
元注解
元注解是负责对其它注解进行说明的注解。
Java5定义了4个注解,分别是@Documented、@Target、@Retention 和 @Inherited。Java8又增加了@Repeatable和@Native两个注解。
自定义注解
基本注解和元注解,如果这两种注解不能满足你的需求,可以自定义注解。
不包含任何成员变量的注解称为标记注解,例如基本注解中的@Override注解就属于标记注解。
包含成员变量的注解称为元数据注解,因为它们可以接受更多的元数据。
注解的用法
注解的实现的原理很大的一部分是基于反射实现。
使用反射获取到类对象,进而获取构造器、字段和方法等。在源码中,类、构造器、字段和方法等均实现了AnnotatedElement接口。而这个接口包含了关于注解的一些方法。
可以通过反射来获取某个类或方法是否拥有注解。注解了些什么。需要按照这些注解整形那些步骤。
注解是一种分散式的元数据,与源代码绑定。
xml是一种集中式的元数据,与源代码无绑定。
在Java后台的开发过程中,服务器的配置项大多会存放在一个xml文件中,而Spring基于注解进行配置,从而替代了配置文件的功能。两者各有好处也有缺点。
注解有几个主要用途:
- 生成文档,通过代码里标识的元数据生成javadoc文档。
- 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
- 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
- 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例
参考: