Java注解

本文最后更新于:2022年12月8日 晚上

Java注解

注解概述

Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
Annotation可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation的name = value对中。

基本的Annotation

使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用,用于修饰它支持的程序元素。

三个基本的Annotation:

  • @Override:限定重写父类方法,该注释只能用于方法。
  • @Deprecated:用于表示某个程序元素(类,方法等)已过时
  • @SuppressWarnings:抑制编译器警告。

实例:

public class TestAnnotation {
    @SuppressWarnings("unused")
    public static void main(String[] args) {

        A a = new A();
        a.method2();

        String str = "abc";
    }
}

class A{
    void method1(){}

    @Deprecated
    void method2(){}
}

class B extends A{

    @Override
    void method1(){}
}

自定义Annotation

定义新的Annotation类型使用@interface关键字。
Annotation的成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员的名字和类型(类似接口方法声明)。
可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字。
没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation。

实例:

定义注解HelloAnnotation

public @interface HelloAnnotation {
    //指定成员变量的初始值可使用default关键字
    public String name() default "";
}

使用注解HelloAnnotation

@HelloAnnotation()//用了default,可空
class A{
    @HelloAnnotation(name = "method")
    void method1(){}
}

提取Annotation信息

反射

JDK的元Annotation

JDK的元Annotation用于修饰其他Annotation定义

@Retention:只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

  • RetentionPolicy.CLASS:编译器将把注释记录在class文件中.当运行Java程序时,JVM不会保留注释。这是默认值
  • RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释(常用)
  • RetentionPolicy.SOURCE:编译器直接丢弃这种策略的注释

@Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。

//限定此注解只能修饰方法和类
@Target(value = {ElementType.METHOD,ElementType.TYPE})
public @interface HelloAnnotation {
    public String name() default "";
}

@Documented:用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。
@Inherited:被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注释


Java注解
http://yorick.love/2022/04/30/Java/Java注解/
作者
Yorick
发布于
2022年4月30日
许可协议