java中的注解
1、什么是java中的注解
先看一下专业解释
Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。
注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。
注解有许多用处,主要如下:
- 提供信息给编译器: 编译器可以利用注解来探测错误和警告信息
- 编译阶段时的处理: 软件工具可以用来利用注解信息来生成代码、Html文档或者做其它相应处理。
- 运行时的处理: 某些注解可以在程序运行的时候接受代码的提取
个人理解的注解
java中自带的一些注解像是@Override,@Deprecated,@SuppressWarnings,这些注解最基本的是给编译器看,如果不符合注解的场景,编译直接报错,从这些现象看,最直观的感觉是注解帮我们在类上,方法上打了一些标签,这些标签是有杀伤力的,如果我们这些类,方法不满足,直接编译不通过,还有如lombok里面的@Setter @Getter ,spring中的@Autowired 直接帮助我们生成了一些代码,又是对运行期的一些操作。可以理解为在不影响运行的情况下对这些程序作了增强标记,后续处理类根据这些增强标记来做处理,甚至可以获取注解的内容来做处理,如spring中的@Component("collectionService"),交给容器管理类对象,bean的名称是`collectionService`
2、如果定义一个注解
注解和class,interface,enum一样,也是一种类型。从jdk1.5版本之后开始引入。
注解的关键字为@Interface
,也就是说
public @interface MyAnnotation{
}
就定义好了一个注解。
使用的话,只需要在需要被注解的地方加上@MyAnnotation
就可以了。
2.1、元注解
元注解是jdk提供给我给注解上注解的操作,其实是为了解释自定义注解的行为,元注解有五个
- @Retention 保留期 代表注解的存活时间,有三个值,RetentionPolicy.SOURCE(源码阶段),RetentionPolicy.CLASS(编译阶段),RetentionPolicy.RUNTIME(运行阶段)。
- @Documented 将注解的元素包含到javadoc中。
- @Target 注解目标,可以使用当前注解的情况,大概有八个值
- ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
- ElementType.CONSTRUCTOR 可以给构造方法进行注解
- ElementType.FIELD 可以给属性进行注解
- ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
- ElementType.METHOD 可以给方法进行注解
- ElementType.PACKAGE 可以给一个包进行注解
- ElementType.PARAMETER 可以给一个方法内的参数进行注解
- ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
- @Inherited 继承注解,如果父类被这个注解修饰,则子类也会被修饰。
- @Repeatable 可重复的,从jdk1.8之后被引入的,旨在解决重复注解问题,如一个类可以被同一个注解注解多次,就可以获取多个注解对应的值。
2.2、注解里面的属性
在一个注解里面只有属性,没有方法,定义方法也和我们常见的不一样,
public @interface MyAnnotation{
String name();
}
在jdk1.8之后有了重复注解,这就体现出了一个注解容器的概念,像这样的
public @interface MyAnnotations{
MyAnnotation[] value();
}
2.3、最终获取注解内容
是通过反射来处理的,大概有以下几种处理
- 首先可以通过 Class 对象的 isAnnotationPresent() 方法判断它是否应用了某个注解
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {}
- getAnnotation() 方法来获取 Annotation 对象。
public Annotation[] getAnnotations() {}
- getAnnotations()方法可以获取到所有的注解
public Annotation[] getAnnotations() {}