java 注解

注解就是代码中的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。

1. 元注解 —— 修饰注解的注解

@Retention(RetentionPolicy.XXX)
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented:能够将注解中的元素包含到 Javadoc 中去
@Inherited:继承,父类被该注解修饰,子类也继承父类的注解
@Repeatable:可重复,可以被同一个注解多次修饰

@Retention(保留):注解的存在阶段

  • SOURCE:注解仅存在于源码中,在class字节码文件中不包含
  • CLASS:默认保留策略,注解会在class字节码文件中存在,但运行时无法获得
  • RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到
package java.lang.annotation;

public enum RetentionPolicy {
    SOURCE,

    CLASS,

    RUNTIME
}

@Target(目标):注解作用的范围

  • TYPE: 作用接口、类、枚举、注解
  • FIELD: 作用属性字段、枚举的常量
  • METHOD: 作用方法
  • PARAMETER:作用方法参数
  • CONSTRUCTOR:作用构造函数
  • LOCAL_VARIABLE:作用局部变量
  • ANNOTATION_TYPE:作用于注解(@Retention注解中就使用该属性)
  • PACKAGE:作用于包
  • TYPE_PARAMETER:作用于类型泛型,即泛型方法、泛型类、泛型接口 (jdk1.8加入)
  • TYPE_USE: 类型使用.可以用于标注任意类型除了 class (jdk1.8加入)
    常用:TYPE、FIELD、METHOD、PARAMETER、ANNOTATION_TYPE
package java.lang.annotation;

public enum ElementType {

    TYPE, 

    FIELD,

    METHOD,

    PARAMETER,

    CONSTRUCTOR,

    LOCAL_VARIABLE,

    ANNOTATION_TYPE,

    PACKAGE,

    TYPE_PARAMETER,

    TYPE_USE
}

2. 注解的属性

注解的本质 —— 接口
所以注解也可以有属性和方法,但接口的中的属性是 public static final 修饰,所以对注解而言无实际意义,因此接口的方法就相当于注解的属性。

package java.lang.annotation;

public interface Annotation {

    boolean equals(Object obj);

    int hashCode();

    String toString();

    Class annotationType();
}

注解属性类型可以有以下列出的类型

  • 基本数据类型
  • String
  • 枚举类型
  • 注解类型
  • Class类型
  • 以上类型的一维数组类型

例:

package com.wl.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author wl
 * @date 2021年6月16日 11:57:19
 */
@Target(value = {ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
    String name();

    int age();

    String gender() default "男";

    String[] hobbies();
}
package com.wl.annotation;

import java.util.Arrays;

@AnnotationTest(name = "Tom", age = 20, hobbies = {"music", "sports"})
public class AnnotationDemo {
    public static void main(String[] args) {
        Class annotationDemoClass = AnnotationDemo.class;
        // 获取 AnnotationDemo 类上的注解 AnnotationTest 属性
        AnnotationTest annotation = annotationDemoClass.getAnnotation(AnnotationTest.class);

        System.err.println(annotation.name() + "\t" + annotation.age() + "\t" + annotation.gender() + "\t" + Arrays.toString(annotation.hobbies()));

    }
}
运行效果图
3. java 自带的注解

@Override:重写方法
@SuppressWarnings:阻止警告
@Deprecated:标注过时的方法、过时的类、过时的成员变量
@FunctionalInterface:标注函数式接口
@SafeVarargs:参数安全类型注解,阻止编译器产生 unchecked 这样的警告。

参考:
https://www.jianshu.com/p/9471d6bcf4cf

你可能感兴趣的:(java 注解)