注解(Annotation)

基本注解

作用在代码的注解是
  • @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。

  • @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。

  • deprecation:使用了不赞成使用的类或方法时的警告;
    unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型;
    fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    path:在类路径、源文件路径等中有不存在的路径时的警告;
    serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
    finally:任何 finally 子句不能正常完成时的警告;
    all:关于以上所有情况的警告
  • @SuppressWarnings - 指示编译器去忽略注解中声明的警告

元注解(对其他注解进行修饰的注解)是:
  • @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。不写该注解默认为CLASS

    • 仅编译期:RetentionPolicy.SOURCE

    • 仅class文件:RetentionPolicy.CLASS

    • 运行期:RetentionPolicy.RUNTIME

  • @Documented - 标记这些注解是否包含在用户文档中(生成在javadoc中)。

  • @Target - 标记这个注解应该是哪种 Java 成员。当注解未使用此注解修饰时可以应用在任何元素上

    //@Target(ElementType.ANNOTATION_TYPE)
    @Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD})//定义Annotation可以应用在源码的哪些位置
    public @interface AnnotationTest {

    }
    public enum ElementType {
       TYPE,//应用在类,接口(包括注解类型),枚举

       FIELD,//应用在字段声明,包括枚举常量

       METHOD,//方法声明

       PARAMETER,//形参声明

       CONSTRUCTOR,//构造函数声明

       LOCAL_VARIABLE,//局部变量声明

       ANNOTATION_TYPE,//注解类型声明

       PACKAGE,//包声明

       TYPE_PARAMETER,//类型参数声明

       TYPE_USE//类型使用声明
    }
  • @Inherited -子类汇继承父类中被@Inherited修饰的注解

从 Java 7 开始,额外添加了 3 个注解:
  • @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。

  • @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。

  • @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。

    @Target({ElementType.ANNOTATION_TYPE,ElementType.FIELD})//定义Annotation可以应用在源码的哪些位置
    @Retention(RetentionPolicy.CLASS)
    public @interface AnnotationTest {
       Test2[] value();//用来存放多个相同注解
    }
    @Repeatable(value = Annotation.class)//@Repeatable括号内的就相当于用来保存该注解内容的容器
    public @interface Test2 {
       int type() default 0;
    }
    @Test2(type = 2)
    @Test2(type = 1)
    public class base {

判断注解是否存在

  • Class.isAnnotationPresent(Class)

  • Field.isAnnotationPresent(Class)

  • Method.isAnnotationPresent(Class)

  • Constructor.isAnnotationPresent(Class)

    w.class.isAnnotationPresent(Test2.class)//类.isAnnotationPresent(注解)存在true

     

反射获取注解

  • Class.getAnnotation(Class)

  • Field.getAnnotation(Class)

  • Method.getAnnotation(Class)

  • Constructor.getAnnotation(Class)

Test2 annotation = base.class.getAnnotation(Test2.class);
System.out.println(annotation.value());

 

 

posted @ 2021-06-15 15:29  blackRx  阅读(105)  评论(0)    收藏  举报
© 2021 GitHub, Inc.