Java-注解

186 阅读2分钟

Java注解

Java注解(Annotation)
注解是元数据的一种(元数据:metadata 即描述数据的数据),也称为标注,是java5中引入的一种注释机制。在框架中会大量使用。
注解类似于标签,可以在Java语言中的类、方法、变量、参数和包等上进行标注。Java注解可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义Java注解。
所有的注解都是java.lang.annotation.Annotation的子接口,所以注解也是一种特殊的接口。

例如:
红箭头标注的都是注解


内置注解

五个基本注解:

注解说明
@Override覆盖父类的方法
@Deprecated用于标注过时的类、方法、成员
@SuppressWarning阻止警告
@FunctionaInterface指定接口必须为函数式接口
@SafeVarargs一直"堆污染警告"

四种元注解: 可以标注在注解上的注解:

  • @Retetion 保留期能设定注解的存活时期

保存时期的值封装在RetentionPolicy枚举类中:
注意:一般自定义的注解使用RUNNTIME
RetentionPolicy.SOURCE:注解只能存在原文件中,编译之后字节码文件中没有。
RetentionPolicy.CLASS:注解可以存在源文件和字节码中,一旦加载进JVM,JVM中不存在。 RetentionPolicy.RUNNTIME: 注解可以存在于文件中、字节、JVM中。

  • @Decumented

注解中的元素包含javadoc中

  • @Target

限定注解可以使用的地方

  • @Inherited

标明注解可被继承,即子类可以继父类的注解。


自定义注解

Java通过关键字@interface自定义注解,注解也可以被其他注解修饰(元注解)。注解和接口类似,内部可以定义常量和方法。
注解定义方法有一些限制:方法不能有参数,返回值只能是基本类型及基本类型的数组。
自定义注解例:

@Target(ElementType.TYPE) //只能修饰类、接口、枚举
@Retention(RetentionPolicy.RUNTIME) //注解保存的范围
@Inherited //可被继承
@Documented //写入javadoc
public @interface Msg {
  String DEFAULT_MSG = "msg";

  String msg() default DEFAULT_MSG; //默认值
}

使用自定义注解:

@Msg(msg = "Test")
public class Test {
    
}

获取注解内容:

public class Main {
  public static void main(String[] args) {
      Test test = new Test();
      Class tClass = test.getClass();
      Msg msg = (Msg) tClass.getAnnotation(Msg.class);
      System.out.println(msg.msg());
  }
}