注解主要分为三大类:普通注解、元注解、自定义注解,下面来详细梳理一下这三大类注解。
普通注解,常见的主要有三个 :@Override(子类对父类方法的重写)、@Deprecated(注解过期、废弃的方法或者类等。若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用。)、@SuppressWarnings(忽略编译器的警告信息)
元注解说白了就是用来注解其他注解的注解。
Java中总共有5种元注解:@Retention,@Documented,@Target,@Inherited,@Repeatable
(1)@Retention
用来说明注解的存活时间,有三种取值:
RetentionPolicy.SOURCE:注解只在源码阶段保留,编译器开始编译时它将被丢弃忽视
RetentionPolicy.CLASS:注解会保留到编译期,但运行时不会把它加载到JVM中
RetentionPolicy.RUNTIME:注解可以保留到程序运行时,它会被加载到JVM中,所以程序运行过程中可以获取到它们
(2) @Documented
这个注解跟文档相关,它的作用是能够将注解中的元素包含到Javadoc中去,应该被JavaDoc所记录。
(3)@Target
用来说明注解的目标,有以下取值:
ElementType.PACKAGE:可作用在包上
ElementType.TYPE:可作用在类、接口、枚举上
ElementType.ANNOTATION_TYPE:可以作用在注解上
ElementType.FIELD:可作用在属性上
ElementType.CONSTRUCTOR:可作用在构造方法上
ElementType.METHOD:可作用在方法上
ElementType.PARAMETER:可作用在方法参数上
ElementType.LOCAL_VARIABLE:可作用在局部变量上,例如方法中定义的变量
ElementType.TYPE_PARAMETER:可作用在类参数的声明上 Since jdk1.8以后添加的
ElementType.TYPE_USE:可作用在使用的类型 Since jdk1.8以后添加的
自定义运行时注解分为两步:声明注解、解析注解。
自定义注解,是以元注解为基础注解自己定义的注解,现在我们来一起来写一个自定义注解的例子:
(1)声明注解
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Animal {
- int value() default 5;
- }
上面是自己定义了一个注解Animal,Animal含有一个int类型的属性,该属性的名称为value,默认值为5。该注解主要用来注解成员变量,作用于运行期。
(2)解析注解
- public class TestMain {
-
- @Animal(value = 12)
- public int age;
- public static void main(String[] args) {
- TestMain testMain=new TestMain();
- Class clazz=testMain.getClass();
- try {
- Field fieldAge=clazz.getField("age");
- Animal animal=fieldAge.getAnnotation(Animal.class);
- System.out.println(animal.value()+"===岁===");
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- }
- }
- }
上面通过类的反射机制解析注解,先拿到TestMain类里面的age成员变量,再通过成员变量调用getAnnotation方法拿到该成员变量的注解。
打印结果:12===岁===