注解
JAVA注解(Annotation)是JDK5引入的一种注释机制,可用于类、方法、字段、参数、包上。虽然是注释机制,但不同于注释的是注解可以被嵌入到字节码当中,从而让我们可以在运行时获取到注解,也就是说可以通过反射来获取注解中的内容。
内置注解
JAVA中是有几个内置注解的,像我们最常见的@Override,@Deprecated。下面详细列举一下内置注解。
- @Override:这个注解应该都不陌生,就是检查本方法是否是重写方法的。
- @Deprecated:这个在源码中比较常见,标记方法过时用的。
- @SuppressWarnings:让编译器忽略注解中的警告。
- @FunctionalInterface:标注一个函数式接口。(jdk8的新特性)
下面几个是元注解,也就是用在注解上的注解。
- @Retention:声明注解作用的生命周期,只保留在源文件 -> 保留在class中 -> 内存中的字节码。如果想在运行时通过反射获取内容,那肯定是要保留在字节码中的。
- @Document:标注该注解是否包含在用户文档中。
- @Target:声明该注解的作用域,是在类上,还是方法上等。
- @Inherited:标注该注解继承自哪个注解(默认是没有继承的)。
- @Repeatable:jdk8开始支持的,标识一个注解可以在同一个声明上使用多次。
注解的定义
定义注解还是比较简单的,只需要声明注解名称,注解内的属性值,以及加上几个必要的元注解即可。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME) // 一般这两个元注解是必须要有的
public @interface Test{ // 这里声明了一个名为Test的注解
String value() default ""; // 声明了该注解有个一String类型的value属性,默认值为""(注意value后有括号)
}
这里要说两个枚举类:Target中的值是ElementType中的值,Retention中的值是RetentionPolicy中的值。
public enum ElementType { // 定义作用域
TYPE, // 作用在类、接口(包括注释类型)或枚举上
FIELD, // 作用在字段声明(包括枚举常量)上
METHOD, // 作用在方法上
PARAMETER, // 作用在方法形参上
CONSTRUCTOR, // 作用在构造方法上
LOCAL_VARIABLE, // 作用在局部变量上
ANNOTATION_TYPE, // 作用在注解上
PACKAGE // 作用在包上
}
public enum RetentionPolicy { // 定义声明周期
SOURCE, // 仅存在于源码中,也就是说编译器处理完之后就没有了
CLASS, // 存在于.class文件中。也是默认行为
RUNTIME // 存储于class文件中,并存在于运行时
}
注解的使用
使用注解就是一件很简单的事情了,用过SpringBoot的应该都很熟练了。需要注意的是,如果注解中只对value赋值的话,可以省略value。其他情况都不能简写。
@Test(value="hello world") // 这里可以省略value,写法是@Test("hello world")
public class TestMyAnnotation{
}
注解获取
要注意只有@Retention(RetentionPolicy.RUNTIME),定义生命周期为运行时才可以通过反射获取注解内容。
public void getAnnotation(){
TestMyAnnotation test = new TestMyAnnotation();
boolean isAnnotationByTest = test.getClass().isAnnotationPresent(Test.class); // 判断该类上是否被Test注解标注
if(isAnnotationByTest){
Test anno = test.getClass().getAnnotation(Test.class); // 获取类上标注的注解
String value = anno.value(); //获取到注解中的value值,也就是"hello world"
}
}
这个是获取类上注解的代码,获取方法,字段,参数上的注解也都是类似的。获取参数的会稍微有些变化,会返回一个Annotation[][]
需要对这个返回值进行遍历。
总结
总的来说注解是不难学习的,实际上我们更多是使用注解,十分方便。注解的定义需要注意的就是声明周期的定义以及作用域的定义,越小越好;获取注解要分两步:先判断是否有该注解,然后才能去获取该注解。合理的利用注解能大大提高我们的开发效率,SpringBoot就使用注解大大减轻了程序员的代码量。